【The number on the board】【CodeForces - 835B 】

题目链接: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到怀疑人生。。。

猜你喜欢

转载自blog.csdn.net/qq_42505741/article/details/81414297