C. Sum of Substrings
原题链接:Problem - 1691C - Codeforces
题目大意:
给你一个长度为n只由0,1组成的字符串,给你k次交换的次数,可以不用完毕,问你交换完毕后,每相邻的字符组成的十进制数之和最小。
题目做法:
只有往最前换和往最后换是会对结果造成影响,接下来就是细节处理的问题了。
AC代码:
#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
//#define ll long long
//Cara's templet version 1.20
//2024/3/7 13:54 UTC+8
//Kids' with no fire in their eyes
//Whose life ended when flame faded away
//And u mf plz hear my admonish
//Don't be that kind of kid
//Plz keep ur unique flame
//I wanna see ur blaze
using namespace std;
const int maxn=1e6+10;
void solve()
{
int n,k,res=0;
vector<int> zps;
cin>>n>>k;
string str;
cin>>str;
for(int i=0;i<str.length()-1;i++)
{
int add=(str[i]-'0')*10+(str[i+1]-'0');
if(str[i]=='1')
{
zps.pb(i);
}
res+=add;
}
if(zps.size()==1)
{
int dir=zps[0],dirfin=n-1-zps[0];
//cout<<dirfin<<'\n';
if(dirfin<=k&&str[n-1]!='1')
{
res-=10,k-=dirfin;
if(zps[0]==0) res+=1;
}
else if(dir<=k&&str[0]!='1') res-=1,k-=dir;
}
else if(zps.size()>=2)
{
int dir=zps[0],dirfin=n-1-zps[zps.size()-1];
if(dirfin<=k&&str[n-1]!='1')
{
res-=10,k-=dirfin;
}
if(dir<=k&&str[0]!='1') res-=1,k-=dir;
}
cout<<res<<'\n';
}
signed main()
{
fast int casen=1;
cin>>casen;
while(casen--) solve();
}