题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422
思路:DP,状态f[i]保存到达第i个城市口袋里的钱和最多能访问到的城市个数,用序列型DP的思想处理,按照终点进行DP即可
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 200010
using namespace std;
struct node
{
int num,v; //v=到达第i个城市时口袋里的钱,num=到达第i个城市时最多访问的城市个数
}f[MAXN];
int cnt[MAXN]; //cnt[i]=在第i个城市时多得到的钱
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
int money,cost;
scanf("%d%d",&money,&cost);
cnt[i]=money-cost;
cnt[i+n]=money-cost;
}
f[1].v=cnt[1];
if(f[1].v>=0) f[1].num=1;
else f[1].num=0;
if(n>=2)
{
for(int i=2;i<=2*n;i++)
{
if(f[i-1].v>=0)
{
if(f[i-1].v+cnt[i]>=0)
{
f[i].v=f[i-1].v+cnt[i];
f[i].num=f[i-1].num+1;
if(f[i].num>=n) break;
}
else
{
f[i].v=cnt[i];
if(cnt[i]>=0) f[i].num=1;
else f[i].num=0;
}
}
else
{
f[i].v=cnt[i];
if(cnt[i]>=0) f[i].num=1;
else f[i].num=0;
}
}
}
int ans=0;
for(int i=1;i<=2*n;i++)
if(ans<f[i].num)
ans=f[i].num;
printf("%d\n",ans);
}
return 0;
}