标签:targe convert pac lis 次数 reset name space mes
题目大意:
给你一个长度为 nn 的01串( n \leq 3*10^5n≤3∗105 ),你有两种操作:
1.将一个子串翻转,花费 XX
2.将一个子串中的0变成1,1变成0,花费 YY
求你将这个01串变成全是1的串的最少花费。
首先,你要操作的次数一定是这个串中0的段数,操作2覆盖消去一段0,操作1翻转将两段合并成一段
如果单纯考虑操作2,需要进行cnt次(这个串中0的段数),
如果单纯考虑操作1,需要进行cnt-1次(这个串中0的段数)+1(必须进行操作2)。
既然操作1,2的效果是一样的,那么cnt-1次就可以取最小的x,y去操作,最后再加上最后一次覆盖即可。
#include<bits/stdc++.h> using namespace std; string s; int x,y,n; int main() { cin>>n>>x>>y; cin>>s; int cnt=0; s[s.length()]=‘1‘; for(int i=0;i<s.length();i++){ if(s[i]==‘0‘&&s[i+1]==‘1‘) ++cnt; } if(!cnt) printf("0"); else printf("%lld",1ll*min(x,y)*(cnt-1)+y); return 0; }
标签:targe convert pac lis 次数 reset name space mes
原文地址:https://www.cnblogs.com/song-/p/9610878.html