"蔚来杯"2022牛客暑期多校训练营4补题 K,H

K NIO's Sword 思维

题意:
玩家初始有一把攻击力为A=0的剑,需要依次击杀 𝑛\((n<1e6)\) 个敌人,仅当攻击力模 𝑛 与 𝑖 同余才能击杀第 𝑖 个敌人。玩家可以升级剑,每次升级相当于\(A=10×A+x\),x为1-9的任何一个数,问最少需要几次升级,才成杀死所有的敌人。
做法:
很明显我们有
\(A\%n=i\)就没有\(A\%n=i-1\),因此每次都至少升级一次。
因为\((n<1e6)\),所以每次升级次数不会大于6次。

设为了击杀第 \(𝑖\) 只怪物进行了 \(k_i\) 次升级,则有
$ A_{i-1} × 10^{k_i} + x_i ≡ A_i \,\, (\mod n)$ \(0≤𝑥_𝑖<10^{𝑘_𝑖}\)

由于 \(A_i≡i (\mod n)\)
则有
$ A_{i-1} × 10^{k_i} + x_i = i \,\, (\mod n)$ \(0≤𝑥_𝑖<10^{𝑘_𝑖}\)

对于每个 i 值,从小到大枚举 \(k_i\) 的取值,并计算 \(x_i\)可取的最小非负值,直到找到一个满足条件的解即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
int pw[20];
int n;
int A;
int check(int len,int i)
{
     int res=A*(pw[len]%n);
     res%=n;
     int need=(i-res+n)%n;
     if(need<pw[len]) return 1;
     else return 0;
}
signed main()
{
    cin>>n;
    pw[0]=1;
    for(int i=1;i<=15;i++) pw[i]=pw[i-1]*10;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=6;j++)
        {
            if(check(j,i))
            {
                A=i;
                ans+=j;
                break;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

H Wall Builder II 贪心

给定一个n (n<100)。
则给你有 n 个 11 的矩形, n-1 个 12 的矩形, n-2 个 13 的矩形...... 一个 1n 的矩形。

现在你需要把他们排成一个矩形,使得周长最长。

注意:只能横着放。
输出方案。

思路
模拟即可。

我们先获得这个大矩形的面积 s ,然后枚举长宽\(w,h(w*h=s)\).

这样我们就只需要一行一行的放这些矩形小方块即可。

有一个贪心的结论,每次我们都放入,小于等于当前行剩下的长度中最大的那一个方块。

posted @ 2022-08-01 08:11  kingwzun  阅读(21)  评论(0)    收藏  举报