A题
题意 给定字符串 可以进行任意次操作 删除字符串中相邻的 01 字符 后字符串合并 求出操作后字符串的最短长度
题解 贪心 因为字符串中只有 0 1 那么只要求出 0 的个数 和 1 的个数 即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n,cnt_0=0,cnt_1=0;
string s;
cin>>n>>s;
for(int i=0;i<n;++i)
{
if(s[i]=='0')cnt_0++;
else cnt_1++;
}
cout<<n-min(cnt_0,cnt_1)*2<<endl;
return 0;
}
B题
题意 给定齿轮序列 齿轮旋转顺序为 ( 顺 逆 顺 逆 ) 每个齿轮都有一个当前的活动齿轮 可以进行任意次操作 每操作
一次齿轮 活动一个位置 求是否可以通过 任意次操作 使齿轮的活动齿排列为 0,1,2 …n-2,n-1
题解 数据范围很小 直接模拟即可 复杂度为 O(n^2)
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,a[N];
bool check()
{
for(int i=1;i<=n;++i)
if(a[i]!=i-1)return false;
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i];
bool success=false;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(j%2==1)a[j]=(a[j]+1)%n;
else a[j]=(n+a[j]-1)%n;
}
//for(int j=1;j<=n;++j)cout<<a[j]<<" ";
//cout<<endl;
if(check())
{
success=true;
break;
}
}
if(success)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}