题目
思路
分析可发现,最多只能进行一次交换操作,若进行了多次交换,那肯定不如删除便宜,所以问题变成用删除操作使成立的最小价值,其中有一个1,0可以交换,考虑dp的做法,将每个元素作为分界线,前面全为0后面全为1,在考虑下可不可以交换,dp每个位置的最小代价得出答案
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
for(int tt=0;tt<t;tt++)
{
string str;
cin>>str;
int c0,c1,n;
c1=count(str.begin(),str.end(),'1');
n=str.size();
c0=n-c1;
int s1=0,s0=0;
long long ans=1e18,cost=1e12;
if(n==1) ans=0;
for(int i=0;i<n;i++)
{
s1+=(str[i]=='1');
s0+=(str[i]=='0');
if(i!=n-1)
{
int k=s1+(c0-s0);
if(str[i]=='1') k--;
if(str[i]=='1'&&str[i+1]=='0')
{
k--;
ans=min(ans,1ll*k*(cost+1)+cost);
}
else
{
ans=min(ans,1ll*k*(cost+1));
}
}
else
{
ans=min(ans,1ll*c1*(cost+1));
ans=min(ans,1ll*c0*(cost+1));
}
}
cout<<ans<<'\n';
}
return 0;
}