解题思路:动态规划
先预处理:对于每一个城市,生活费-花费,得到一个数。
接着就是求最大连续子序列和(这题是统计个数),这就算是经典问题吧。
状态转移方程:
d[i] = d[i-1]+a[i] >= 0 ? d[i-1]+a[i] : 0
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define clr(p,v) memset(p,v,sizeof(p))
const int maxn = 200010 ;
int n, m, C;
int d[maxn];
int main()
{
while (~scanf("%d", &n))
{
//Input
for (int i=1; i<=n; ++i)
{
int have, pay;
scanf("%d%d", &have, &pay);
d[i] = d[i+n] = have - pay;
}
//Calculate
int cnt, total, mx;
mx = 1;
cnt = total = 0;
for (int i=1; i<=n; ++i)
{
total += d[i];
if (total < 0)
{
if (mx < cnt) mx = cnt;
cnt = total = 0;
}
else
++cnt;
}
if (total >= 0)
{
for (int i=n+1; i<=n+n; ++i)
{
total += d[i];
if (total < 0)
{
if (mx < cnt) mx = cnt;
break;
}
++cnt;
}
}
if (cnt > mx) mx = cnt;
if (mx > n) mx = n;
//output
printf("%d\n", mx);
}
return 0;
}