反思 要明确每个变量的含义!!!
读题
1.取一对01置换,或者删掉一个元素,使得经过若干次改变后的序列\(t\),和\(s\)的前\(|t|\)项元素各不相同。求问最少要删掉几个元素?
一些事实的思考
1.对于一个给定的序列\(a\),和另一个 “0的个数”与“1的个数”均相同,但是排列不同的 序列b,能否经过有限次01置换使b变成a?
答案是可以的。具体请参考线性代数中逆序数的介绍,看完你就明白了。
2.截取\(s\)的前\(|k|\)段为\(s1\),设\(s1\)含0的个数为\(a\),含1的个数为\(b\),则对应的\(t\)需要\(a\)个1,\(b\)个0。
思路
1.线性循环,计算当前状态含01的个数,和达到当前状态时减去01的个数,有多少个零->就需要保留多少个1->就需要减去多少个1
2.如果需要1或0的个数不够了,说明达不到当前状态,后面状态也一定达不到,退出。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
string s;
cin>>s;
int a=0,b=0;
for(int i=0;s[i];i++)
if(s[i]=='1')a++;
else b++;
int ans=a+b;
int a1=0,b1=0;
for(int i=0;s[i];i++)
{
if(s[i]=='1')b1++;
else a1++;
if(a1>a||b1>b)break;
ans=min(ans,a+b-a1-b1);//总数减去需要保留的个数
}
cout<<ans<<endl;
}
return 0;
}
标签:01,int,个数,a1,++,Swap,Delete,b1
From: https://www.cnblogs.com/pure4knowledge/p/17913378.html