问题F:翻硬币
题目描述
小 Q 面前的桌子上有 N 个硬币,0 表示正面,1 表示反面,现在他有一次机会可以选择一个 ai~bi 的段,把这个段的硬币都翻转一面,他现在想知道 N 个硬币中最多可以有多少个硬币正面朝上。
输入
第一行一个整数 N,表示桌子上有 N 个硬币。
第二行为 N 个 0 和 1,表示硬币 i 的状态。其中 0 表示正面,1 表示反面。
输出
第一行有一个整数,表示翻转后最多有多少个硬币正面朝上。
#include <bits/stdc++.h>
using namespace std;
#define MX 1000000
int a[MX + 10];
long long mx, origin;
int main()
{
int n;
scanf("%d", &n);
int i;
/*求原始状态下硬币状态为正面(0)的个数*/
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (a[i] == 0)
{
origin++;
}
}
/*求1的「净个数」(1的数目-0的数目),即硬币反转后能增加正面(0)最长的一段*/
int t = 0;
for (i = 1; i <= n; i++)
{
if (a[i] == 1)
{
t++;
}
else
{
t--;
}
if (t > mx)
{
mx = t;
}
if (t < 0)
{
t = 0;
}
}
printf("%lld\n", origin + mx);
return 0;
}