Lucky Transformation解题报告

题目大意

给你 n n n个数字( n ∈ { d n } n\in \left\{d_n\right\} n{dn}),进行k次操作,每次找到最小的 x x x使得 d x = 2 d_x=2 dx=2 d x + 1 = 3 d_{x+1}=3 dx+1=3,此时如果 x x x为奇数, d x + 1 = 2 d_{x+1}=2 dx+1=2, x x x为偶数, d x = 3 d_x=3 dx=3,若 x x x不存在,序列不变。

输入格式

多组数据,每组第一行两个数 n , k n,k n,k,第二行 n n n个无空格的数

输出格式

每组数据输出一行,为改变后的序列

样例输入

7 2
2343223
4 1
2234

样例输出

2243233
2334

解题思路

枚举+找规律可以发现,当 d x = 2 , d x + 1 = 2 , d x + 2 = 3 d_x=2,d_{x+1}=2,d_{x+2}=3 dx=2,dx+1=2,dx+2=3 d x = 2 , d x + 1 = 3 , d x + 2 = 3 d_x=2,d_{x+1}=3,d_{x+2}=3 dx=2,dx+1=3,dx+2=3时,两种情况会交替出现循环

CODE

#include<bits/stdc++.h>
#define r register
#define Fu(a,b,c) for(r int a=b;a<=c;++a)
#define Fd(a,b,c) for(r int a=b;a>=c;--a)
using namespace std;

long long n,k;
int a[10000001];

void print()
{
	Fu(i,1,n)
	{
		printf("%d",a[i]);
	}
	puts("");
}

int main()
{
//	#define freopen(a,b,c)
//	freopen("trans.in","r",stdin);
//	freopen("trans.out","w",stdout);
	
	while(cin>>n>>k)
	{
		string p;
		cin>>p;
		long long s=p.size(),len=-1,cnt=0;
		Fd(i,s-1,0)
		{
			a[n-(++len)]=p[i]-'0';
		}
		
		Fu(i,1,n-1)
		{
			if(i<=n-2 && i&1 && a[i] == 2 && a[i+1] == 2 && a[i+2] == 3)
			{
				cnt=k-cnt;
				if(cnt&1)
				{
					a[i+1]=3;
				}
				break;
			}
			if(i<=n-2 && i&1 && a[i] == 2 && a[i+1] == 3 && a[i+2] == 3)
			{
				cnt=k-cnt;
				if(cnt&1)
				{
					a[i+1]=2;
				}
				break;
			}
			if(a[i] == 2 && a[i+1] == 3)
			{
				if(i&1)
				{
					a[i+1]=2;
					cnt++;
					if(cnt == k)
					{
						break;
					}
				}
				else
				{
					a[i]=3;
					cnt++;
					if(cnt == k)
					{
						break;
					}
					if(i > 1 && a[i-1] == 2)
					{
						i-=2;
						continue;
					}
				}
			}
		}
		print();
	}
	return 0;
}
posted @ 2020-11-30 21:48  榴恋666  阅读(77)  评论(0编辑  收藏  举报