B. Swap and Delete

发布时间 2023-12-19 11:54:05作者: 纯粹的

原题链接

反思 要明确每个变量的含义!!!

读题

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