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;
}