codeforces609div2C

1494 단어 욕심
길이 가 n (1 < = n < = n < = 20000) 인 숫자 가 있 습 니 다. 가장 작은 숫자 를 구 해서 이 숫자 보다 크 고 순환 절 은 k 입 니 다. 앞의 k 숫자 는 전체 숫자 를 결정 할 수 있 습 니 다. 만약 에 구 조 된 숫자 가 원래 의 숫자 보다 작 으 면 욕심 을 고려 하여 숫자 를 커지 게 합 니 다. 즉, k 번 째 숫자 에 1 을 더 합 니 다.
#include 
#include 
#include 
using namespace std;
const int maxn=200000+10;
int A[maxn];
int B[maxn];
int main(){
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	int n,k;
	scanf("%d %d",&n,&k);
	for(int i=1;i<=n;i++){
		char c=getchar();
		while(c'9')
			c=getchar();
		A[i]=c-'0';
	}
	for(int i=1;i<=k;i++){
		B[i]=A[i];
		if(i+k<=n)
			B[i+k]=B[i];
	}
	for(int i=k+1;i<=n;i++){
		if(i+k<=n)
			B[i+k]=B[i];
	}
	int u=1;
	for(int i=1;i<=n;i++){
		if(A[i]>B[i]){
			u=0;
			break;
		}
		if(B[i]>A[i]){
			u=1;
			break;
		}
	}
	if(u){
		printf("%d
",n); for(int i=1;i<=n;i++) printf("%d",B[i]); return 0; } B[k]=B[k]+1; for(int i=k;i>=1;i--){ if(B[i]>=10){ B[i]=B[i]-10; B[i-1]++; } } if(B[0]){ for(int i=0;i<=n;i++){ if(i+k<=n) B[i+k]=B[i]; } printf("%d
",n+1); for(int i=0;i<=n;i++) printf("%d",B[i]); } else { for(int i=1;i<=n;i++){ if(i+k<=n) B[i+k]=B[i]; } printf("%d
",n); for(int i=1;i<=n;i++) printf("%d",B[i]); } return 0; }

좋은 웹페이지 즐겨찾기