Codeforces 327A-Flipping Game(暴力枚举)

A. 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 xmeans 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
4
1 0 0 1
output
4
题意:翻牌游戏。

给出n张牌,每张牌仅仅有0和1两种状态。给出初始状态。对于翻牌操作这样规定:每次操作可将区间[i,j](1=<i<=j<=n)内牌的状态翻转(即0变1,1变0)。求一次翻转操作后,1的个数尽量多。

枚举区间+遍历区间推断,O(n^3);
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cstdlib>
#include <set>
#include <map>
#include <vector>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
const int INF=0x3f3f3f3f;
#define LL long long
int a[110];
int main()
{
	int n,num[2];
	while(~scanf("%d",&n))
	{
		int ans=0;
		for(int i=0;i<n;i++)
		{
			scanf("%d",a+i);
		    if(a[i]==1)
				ans++;
		}
		int pos=ans;
		if(pos==n)
		{
			printf("%d
",n-1);
			continue;
		}
		for(int i=0;i<n;i++)
			for(int j=i;j<n;j++)
			{
			   memset(num,0,sizeof(num));
			   for(int k=i;k<=j;k++)
					num[a[k]]++;
				if(num[0]>num[1])
					ans=max(ans,pos+num[0]-num[1]);
			}
			printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/cxchanpin/p/6991100.html