链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422
中文题。
将每个城市生活费和花费的差都存起来。从头开始找能否去这个地方能的话就将数目+1,但是他这个是可以是一个环形的顺序的(也就是起点并不一定要在第一个),结果估计是我太笨了,想枚举起点(orzzzzz虽然觉得10^6这个O(n^2)估计妥妥超时),但是还是写了下orzzz结果如我所料就是T了。
后来想了一会还是没有想出来,去看了别人写的,直接在后面加上一组一模一样的就可以了,就可以起到从任意起点开始的作用,要注意的就是如果能去的城市数已经等于n的话,就直接退出这个循环,不然可能比如全部都是正的,直接变成可以去2n的城市了。。。
附上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 100009
#define INF 0x3f3f3f3f
int s[M];
int dp[M];
int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i = 0;i < n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
s[i] = a-b;
}
int sum = 0;
int num = 0;
int maxn = -INF;
for(int i = 0;i < 2*n;i++)
{
int temp = s[i%n];
sum += temp;
if(sum>=0)
{
num++;
maxn = max(maxn,num);
if(num==n) break;
}
else
{
sum = 0;
num = 0;
}
}
printf("%d\n",maxn);
}
return 0;
}