1268A - Long Beautiful Integer(字符串贪心)

传送门开启了传送门吃

\(其实要发现只需要考虑[1,k]这个循环节\)

\(开始我们想让数字最小那么[1,k]就和目标串相等就好了\)

\(然后我们从目标串的k+1位开始判断\)

\(Ⅰ.若相等,无事发生,继续判断下一个字母\)

\(Ⅱ.若比目标串大,那么继续判断下去也一定大,break\)

\(Ⅲ.若比目标串小,那么要从k往前找一个不为9的数+1,然后这个数到k都变成0\)

\(使得构造出比目标串大一点的串,break\)

\(由此,我们构造出了[1,k],那么后面也只是循环罢了。\)

#include <bits/stdc++.h>
using namespace std;
int n,k;
char s[200009];
int a[200009],top,vis[200009];
int main()
{
	cin>>n>>k>>(s+1);
	for(int i=1,l=strlen(s+1);i<=l;i++)
	{
		if(i<=k)	a[i]=s[i]-'0';
		else
		{
			int t=i%k;
			if(t==0)	t=k;
			if(a[t]>s[i]-'0')		break;//分出胜负了 
			else if(a[t]==s[i]-'0')	continue;
			else 
			{
				int num;
				for(int j=k;j>=1;j--)
				if(a[j]!=9)	{num=j;break;}
				a[num]+=1;
				for(int j=num+1;j<=k;j++)	a[j]=0;
				break;
			}
		}	
	}
	cout<<strlen(s+1)<<endl;
	for(int i=1,l=strlen(s+1);i<=l;i++)
	{
		int t=i%k;
		if(t==0)	t=k;
		cout<<a[t];	
	}	    
}
posted @ 2020-05-15 18:53  倾叶子佮  阅读(170)  评论(0编辑  收藏  举报