Salty Fish(区间和)

Problem 2253 Salty Fish

Accept: 35    Submit: 121
Time Limit: 1000 mSec    Memory Limit : 32768
KB

Problem Description

海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼。一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名。更准确地说,渔夫会选择一个区间[L,R],改变区间内所有咸鱼的状态,至少翻转一只咸鱼。

渔夫离开后想知道如果他采取最优策略,最多有多少只咸鱼成功翻身,但是咸鱼大概有十万条,所以这个问题就交给你了!

Input

包含多组测试数据。

每组测试数据的第一行为正整数n,表示咸鱼的数量。

第二行为长n的01串,0表示没有翻身,1表示成功翻身。

n≤100000

Output

在渔夫的操作后,成功翻身咸鱼(即1)的最大数量。

Sample Input

5
1 0 0 1 0
3
0 1 0

Sample Output

4
2

Hint

对于第一个样例,翻转区间[2,3],序列变为1 1 1 1 0。

对于第二个样例,翻转整个区间,序列变为1 0 1。

Source

福州大学第十四届程序设计竞赛_重现赛

//对于 1 的鱼,翻身收益 -1 ,对于 0 的鱼,收益为 1 ,先这么处理,然后,就是求最大区间和的问题了

有个坑,因为必须要翻一次!

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5 #define MX 100010
 6
 7 int a[MX];
 8
 9 int main()
10 {
11     int n;
12     while (scanf("%d",&n)!=EOF)
13     {
14         int sum1=0;
15         for (int i=1;i<=n;i++)
16         {
17             int x;
18             scanf("%d",&x);
19             sum1+=x;
20             if (x) a[i]=-1;
21             else a[i]=1;
22         }
23         int mmm=-1,rec=0;   //mmm=-1 因为必须要翻一次,全为 1 时
24         for (int i=1;i<=n;i++)
25         {
26             if (rec>0) rec+=a[i];
27             else rec=a[i];
28             mmm = max(rec,mmm);
29         }
30         printf("%d\n",mmm+sum1);
31     }
32     return 0;
33 }

时间: 2024-10-01 06:45:24

Salty Fish(区间和)的相关文章

FOJ Problem 2253 Salty Fish

                                                                                                                                                                       Problem 2253 Salty Fish Accept: 35    Submit: 121Time Limit: 1000 mSec    Memory Li

FZU 2253 salty fish

https://vjudge.net/problem/FZU-2253 题意:略 思路: 一开始改变区间,还以为是线段树...还是dp的题做得太少了. 这题一开始我们可以统计出一共有多少只翻身的咸鱼,对于每一个位置上,如果是1,那么改变它,翻身咸鱼数少1,如果是0,那么就加1.所以,就可以直接利用动态规划,dp[i]表示翻转到第i位时的翻身的增加数目,可能为负,因为至少翻转一只鱼.转移方程dp[i] = max(tmp,dp[i-1] + tmp),tmp表示当前的格子是翻还是不翻.切记ans一

2017 Fzu校赛 [Cloned]

A - Salty Fish 海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼.一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向,一只只咸鱼翻过去,翻转若干只后就转身离去,深藏功与名.更准确地说,渔夫会选择一个区间[L,R],改变区间内所有咸鱼的状态,至少翻转一只咸鱼. 渔夫离开后想知道如果他采取最优策略,最多有多少只咸鱼成功翻身,但是咸鱼大概有十万条,所以这个问题就交给你了! Input 包含多组测试数据. 每组测试数据的第

2019 Multi-University Training Contest 6

Salty Fish Support or Not Three Investigators Milk Candy Ridiculous Netizens Stay Real #include <bits/stdc++.h> using namespace std; const int maxn=100010; typedef long long ll; struct node { ll val,id; node(int _val,int _id):val(_val),id(_id) {}; b

HDU #5283 Senior&#39;s Fish

题目描述: 平面上有一些鱼,初始时鱼会在一些位置,某些时刻编号在一段区间内的鱼会同时向x轴正方向,或y轴正方向平移一定距离,某些时刻会询问一个矩形内鱼的数量. 解题思路: 显然地,求一个矩形内的鱼可以用矩形四个顶点为右上角的整个左下矩形加加减减.那么问题就转化为一个顶点左下角矩形内鱼的数量.注意到鱼只会向右和向上的话,那就很好做.维护两颗线段树,分别维护编号在l~r的鱼的x坐标最大值.y坐标最大值.每次修改对应区间加.每次如果区间最大值大于限制,那就找出最大值的位置,赋为-inf,同时在树状数组

Gym - 101964E Fishermen(差分区间修改)

题目如上: 题意:题意:n条鱼,每条鱼有自己的坐标有m个捕鱼人,每一个捕鱼人都给出x坐标(y坐标默认为0)每一个捕鱼人都有一个范围 l ,在范围内都能捕鱼,距离为 |a-x|+b 问最后每个捕鱼人对应可以捕捉到多少条鱼 思路: 其实我们稍微思考以下就可以知道:看一下样例中给的图 (1)我们会发现 l 以上的所有鱼都不可能被捕到. ( fish.y > l ) 就不能捕到 (2)如果从捕鱼人的角度去看的话,我们可能需要两重循环,(对人和鱼都遍历) 但是如果计算鱼的贡献的话,我们可以通过计算找到图上

饥饿的牛 线性dp内的区间

饥饿的牛 牛在饲料槽前排好了队.饲料槽依次用1到N(1<=N<=100000)编号.每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料. 约翰提供B个区间的清单.一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等.牛可以任意选择区间,但是牛选择的区间不能有重叠.当然,牛希望自己能够吃得越多越好.给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西.在上面的例子中,1-3和3-4是重叠的:聪明

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

[Noi2016]区间

题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri. 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度.区间 [li,ri] 的长度定义为 ri?li,即等于它的右端点的值减去左端点的值. 求所有合法方案中最小的花费.如果不存在合法的方案,输出 ?1. 输入输出格式