A. Game of Life
题意:
给你一个01的序列 对于每次的变换
如果0的左右一位有且仅有一个1的话 那么这个0变成1
问m次变换之后的数组变换状态
思路
没想到真能模拟过 O(m*n ) 虽然m给的数据范围是1e9
其实考虑最坏的情况下 m 最多只是操作n次而已
所以 其实时间复杂度是 O(n^2)的 所以我们直接模拟即可
code:
记得每次初始化头尾
(条件^条件) 是有且仅当一个条件满足的时候才做
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
char a[N],b[N];
int t,n,m;
void solve()
{
cin>>n>>m;
scanf("%s",a+1);
a[n+1] = '0';
b[n+1] = '0';
b[0] = '0';
for(int i = 1;i<=n;i++)
b[i] = a[i];
for(int i = 1;i<=m;i++)
{
int cnt =0 ;
for(int j = 1;j<=n;j++)
if(b[j] == '0')
if(('1' == a[j-1])^('1' == a[j+1]))
b[j] = '1';
bool flag = 1;
for(int j = 1;j<=n;j++)
if(a[j]!=b[j])
flag = 0;
if(flag)
break;
for(int j=1;j<=n;j++)
a[j] = b[j];
}
for(int i = 1;i<=n;i++)
cout<<a[i];
cout<<endl;
}
int main()
{
cin>>t;
while(t -- )
solve();
return 0;
}
B - Lord of the Values
题意:
给你两个操作 你需要把原数组 转换成 负数数组
思路:
因为题目要求给的是偶数大小的数组
所以我们可以把它拆分成两个数来思考
结果乱打乱撞 221 221 这种操作次数对了
证明待考虑
code:
#include <bits/stdc++.h>
using namespace std;
int t;
const int N = 1e3+10;
int a[N],n;
void slove()
{
for(int i =1 ; i<=n; i++)
scanf("%d",&a[i]);
cout<<6*(n/2)<<endl;
for(int i = 1,j = n; i <= n/2 ; i++,j -- )
{
cout<<'2'<<" "<<i<<" "<<j<<endl;
//a[j]-=a[i];
cout<<'2'<<" "<<i<<" "<<j<<endl;
// a[j]-=a[i];
cout<<'1'<<" "<<i<<" "<<j<<endl;
// a[i]+=a[j];
cout<<'2'<<" "<<i<<" "<<j<<endl;
// a[j]-=a[i];
cout<<'2'<<" "<<i<<" "<<j<<endl;
// a[j]-=a[i];
cout<<'1'<<" "<<i<<" "<<j<<endl;
// a[i]+=a[j];
}
// for(int i = 1; i<=n; i++)
// cout<<a[i]<<" ";
}
int main()
{
cin>>t;
while(t -- )
{
scanf("%d",&n);
slove();
}
return 0;
}