B. Swap and Delete

原题链接

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

读题

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;
}
posted @   纯粹的  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示