CF997A Convert to Ones
Posted song-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF997A Convert to Ones相关的知识,希望对你有一定的参考价值。
CF997A Convert to Ones
题目大意:
给你一个长度为 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; }
以上是关于CF997A Convert to Ones的主要内容,如果未能解决你的问题,请参考以下文章
Convert to Ones CodeForces(超水题)
盗版动归Codeforces998C——Convert to Ones 归一操作
Codeforces round 493 Convert to Ones