Flipping Game
2015-06-08 23:01
260 查看
Flipping Game
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Iahub got bored, so he invented a game to be played on paper.
He writes n integers a1, a2, ..., an.
Each of those integers can be either 0 or 1. He's allowed to do exactly one move: he chooses two indices i and j (1 ≤ i ≤ j ≤ n)
and flips all values ak for
which their positions are in range [i, j] (that
is i ≤ k ≤ j). Flip the
value of x means to apply operation x = 1 - x.
The goal of the game is that after exactly one move to obtain the maximum number of ones.
Write a program to solve the little game of Iahub.
Input
The first line of the input contains an integer n (1 ≤ n ≤ 100).
In the second line of the input there are n integers: a1, a2, ..., an.
It is guaranteed that each of those n values is either 0 or 1.
Output
Print an integer — the maximal number of 1s that can be obtained after exactly one move.
Sample test(s)
input
output
input
output
Note
In the first case, flip the segment from 2 to 5 (i = 2, j = 5).
That flip changes the sequence, it becomes: [1 1 1 0 1]. So, it contains four ones. There is no way to make the whole sequence equal to [1 1 1 1 1].
In the second case, flipping only the second and the third element (i = 2, j = 3) will
turn all numbers into 1.
一些01,改变一个区间,然后把这个区间内1变为0,0变为1,求变化后1的最大个数(必须修改一个数)。一个简单的动规,只需要判断这个数字能最大改变多少1的个数。
if(a[i]==0)dp[i]=max(0,dp[i-1]+1);
if(a[i]==1)dp[i]=max(0,dp[i-1]-1);
然后注意如果全是1的话,这个通项出来的是n,然而题目要求至少改变一个数,所以这个情况就是n-1。特判。
Flipping Game
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Iahub got bored, so he invented a game to be played on paper.
He writes n integers a1, a2, ..., an.
Each of those integers can be either 0 or 1. He's allowed to do exactly one move: he chooses two indices i and j (1 ≤ i ≤ j ≤ n)
and flips all values ak for
which their positions are in range [i, j] (that
is i ≤ k ≤ j). Flip the
value of x means to apply operation x = 1 - x.
The goal of the game is that after exactly one move to obtain the maximum number of ones.
Write a program to solve the little game of Iahub.
Input
The first line of the input contains an integer n (1 ≤ n ≤ 100).
In the second line of the input there are n integers: a1, a2, ..., an.
It is guaranteed that each of those n values is either 0 or 1.
Output
Print an integer — the maximal number of 1s that can be obtained after exactly one move.
Sample test(s)
input
5 1 0 0 1 0
output
4
input
41 0 0 1
output
4
Note
In the first case, flip the segment from 2 to 5 (i = 2, j = 5).
That flip changes the sequence, it becomes: [1 1 1 0 1]. So, it contains four ones. There is no way to make the whole sequence equal to [1 1 1 1 1].
In the second case, flipping only the second and the third element (i = 2, j = 3) will
turn all numbers into 1.
一些01,改变一个区间,然后把这个区间内1变为0,0变为1,求变化后1的最大个数(必须修改一个数)。一个简单的动规,只需要判断这个数字能最大改变多少1的个数。
if(a[i]==0)dp[i]=max(0,dp[i-1]+1);
if(a[i]==1)dp[i]=max(0,dp[i-1]-1);
然后注意如果全是1的话,这个通项出来的是n,然而题目要求至少改变一个数,所以这个情况就是n-1。特判。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int dp[105], a[105]; int max(int a, int b) { return a > b ? a : b; } int main() { int n, i, j, m, ans, pre; cin >> n; pre = 0; for (i = 1; i <= n; i++) { cin >> a[i]; if (a[i] == 1)pre++; } if (a[1] == 0)dp[1] = 1; else dp[1] = 0; for (i = 2; i <= n; i++) { if (a[i] == 1) dp[i] = max(dp[i - 1] - 1, 0); else if (a[i] == 0) dp[i] = max(0, dp[i - 1] + 1); } ans = dp[1]; for (i = 2; i <= n; i++) ans = max(ans, dp[i]); if (ans == 0) cout << pre - 1 << endl; else cout << pre + ans << endl; return 0; }
相关文章推荐
- win7 64位系统更换16G内存条
- 多选框CheckBox的使用
- 第7章 第4题
- 23种常用的设计模式介绍
- 正则表达式介绍及grep的使用
- 自定义AlertDialog(二)
- 单选框RadioButton的使用
- 【Substring with Concatenation of All Words】cpp
- 第五题
- leetcode--Search a 2D Matrix
- linux设备驱动开发详解 通过O_RDWR IOCTL 读写i2c设备
- 性能优化第四篇--移动网络优化
- Java集合框架面试问题集锦
- appium java 环境搭建
- 搭建GIT服务器
- spring总结
- DBUS 的 C 编程接口与配置
- C# 中 async/await 调用传统 Begin/End 异步方法
- ISO 一些常用基本方法
- 简单、强大的swig.js