题目链接:http://codeforces.com/problemset/problem/835/B
很有意思的一道思维题,当看到题目翻译的时候,瞬间懵逼,位之和的翻译错乱,导致题目看的稀里糊涂,在大佬队友的带飞下,理会了这道题的amazing。
解题思路:就是问最少修改几位数,可以使输入的n的位加和大于等于k。
这道题,可以算是桶排序的plus,先开个字符串,将数存进去,主要是给的数据范围太大了,整形没机会啊,在开个数组记录一下每个数字出现的次数,之后暴力强搜。。。完美
ac代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<iostream>
#define inf 0x3f3f3f3f
#define maxn 1050000
using namespace std;
long long int k;
char str[maxn];
int cnt[maxn];
long long int num[maxn];//防止爆int
int main()
{
scanf("%d",&k);
scanf("%s",str);
int len=strlen(str);
long long int sum=0;
for(int i=0;str[i];i++)
{
sum+=(str[i]-'0');//整形数字和字符串数字转换的小技巧
cnt[(str[i]-'0')]++;//桶排序的思想
}//因为需要考虑怎样才能在修改位数最小的情况下,达到最大的位和
if(sum>=k) printf("0\n");
else
{
long long int ls=k-sum;
int biubiubiu=0;
for(int i=0;i<=9;i++)
{
int gg=ceil(ls*1.0/(9-i));
//小可爱的操作,直接计算剩余数值的量是当前位的值的几倍,再进行判断
if(gg<=cnt[i])
{
biubiubiu+=gg;
break;//如果所需位数小于那位已经有的位数直接加上,跳出
}
else
{
biubiubiu+=cnt[i];
ls-=cnt[i]*(9-i);//减小ls的值,进行下一位的操作
}
}
printf("%d\n",biubiubiu);
}//biubiubiu~~~
return 0;
}
这种题目,或者说cf的题目都很有趣,思维跟得上就超美赞臣的,跟不上,TL,WA到怀疑人生。。。