A
来源:互联网 发布:java反射实现原理 编辑:程序博客网 时间:2024/05/29 12:04
海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼。一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名。更准确地说,渔夫会选择一个区间[L,R],改变区间内所有咸鱼的状态,至少翻转一只咸鱼。
渔夫离开后想知道如果他采取最优策略,最多有多少只咸鱼成功翻身,但是咸鱼大概有十万条,所以这个问题就交给你了!
包含多组测试数据。
每组测试数据的第一行为正整数n,表示咸鱼的数量。
第二行为长n的01串,0表示没有翻身,1表示成功翻身。
n≤100000
在渔夫的操作后,成功翻身咸鱼(即1)的最大数量。
51 0 0 1 030 1 0
42
对于第一个样例,翻转区间[2,3],序列变为1 1 1 1 0。
对于第二个样例,翻转整个区间,序列变为1 0 1。
这个题刚开始我就没有思路,不知道怎么去做,看了一下别人的代码,有些地方还是没有搞懂,但是大概的思路就是可以将数据转换一下,对于1来说,每次翻相当于翻身咸鱼数-1,对于0来说,每次翻身相当于翻身咸鱼+1,然后对转换后的数据求最大连续区间和,此时得出的数据为渔夫为咸鱼翻身后比原有多了多少个翻身的咸鱼,然后加上原本翻身的咸鱼数。
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=100005;int a[N],b[N];int main(){ int n; while(~scanf("%d",&n)) { int sum=0,ans=0,max1=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); sum+=a[i]; } if(sum==n) { printf("%d\n",n-1); continue; } for(int i=1; i<=n; i++) { if(a[i]) b[i]=-1; else b[i]=1; } for(int i=1; i<=n; i++) { ans+=b[i]; if(ans<0) ans=0; max1=max(max1,ans); } printf("%d\n",max1+sum); }}
阅读全文
0 0
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- a
- A
- A*
- a
- A
- a
- bzoj1510[POI2006]Kra-The Disks 二分
- mysql-max_allowed_packet
- 秒杀系统的架构解决之道
- Windows CE CAB 向导遇到了错误。有关更多信息,请参阅输出窗口
- Volatile与Synchronized的区别?
- A
- python numpy 学习笔记(9)
- Java读取excel表格
- 程序员有七个等级?你又属于哪个等级呢?
- singleton的饿汉式,懒汉式及关于双检锁的线程安全模式
- Java集合-ConcurrentHashMap工作原理和实现JDK7
- NSNUmber,NSValue,NSNull
- FPGA 主流芯片选型指导和命名规则(一)
- hdu4734 F(x) 数位dp