温馨提示:
本题适合先思考再看题解,相信各位神犇都能轻轻松松过掉它。
题目链接:
https://www.luogu.com.cn/problem/CF997A
分析:
首先要读懂题,to ones,这个ones指的是1而不是1种。。。然后就是考虑算法了:
各位大佬这样考虑:我的改变(0->1和1->0)可以做什么,我肯定不会用它去改变一个既有0又有1的子串(这样不会更优),这个容易想清楚。然后,对字串进行反转又能做什么?
没错,可省掉一次改变:
例如:
00100011110110001100需要5次改变,然后我把前3个进行反转:10000011110110001100后需要4次改变。
既然如此,我们就有思路了:贪心,哪个“便宜”用哪个,但是:无论如何,只要有0,我们总要有一次改变。所以:先记录均是0的极大子串的个数,特判一下,0个直接输出否则输出:改变一次的价+(个数-1)*较小的价格。
最后就是会写循环就能写出来的代码了。
1 #include <cstdio> 2 #include <string> 3 using namespace std; 4 const int maxn=300000+10; 5 char a[maxn]; 6 int main(){ 7 long long n,f,b,ans=0; 8 scanf("%lld%lld%lld%s",&n,&f,&b,a+1); 9 for(int i=1;i<=n;i++) 10 if(a[i]=='0'&&a[i-1]!='0') 11 ans++; 12 printf("%lld",max((long long)0,min(f*ans-f+b,b*ans))); 13 return 0; 14 }