洛谷CF997A:Convert to Ones

温馨提示:

  本题适合先思考再看题解,相信各位神犇都能轻轻松松过掉它。

题目链接:

  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 } 

猜你喜欢

转载自www.cnblogs.com/wish-all-ac/p/12593993.html