"蔚来杯"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)\).
这样我们就只需要一行一行的放这些矩形小方块即可。
有一个贪心的结论,每次我们都放入,小于等于当前行剩下的长度中最大的那一个方块。