http://acm.hdu.edu.cn/showproblem.php?pid=1422
自我感觉本题算是一道有点技术含量的DP题,思路同To the max那题很类似,用一个一维数组存储提供的生活费和所需的花费,可惜当时我没想到,虽然也用了DP思想,但是用了两个数组存储,又用了结构体,比较麻烦,最后程序写的老长,自己都快写晕了,交上自然也就免不了wa的厄运了!
AC代码:
#include<stdio.h>
#define N 100010
int a[N]; //记录第i个城市的供需情况
int main()
{
int n,i,j,max,sum,cns,w,l,flag;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&w,&l);
a[i]=w-l;
}
flag=1;i=max=0;
while(flag)
{
sum=0;
while(a[i]<0)
{
i++;
if(i==n) //如果从第i到第n个城市都是供不应求,则起始位置已遍历一遍,不能继续参观
{ //即直接输出当前max的值;
flag=0;
goto A;
}
}
j=i;
do{ //从当前城市开始累加,看最多能到达的城市数
sum+=a[j];
if(sum<0)
break;
j++;
if(j==n)
{ //如果最后一个城市被算入,说明已经累加到最后一个城市
flag=0; //此do-while循环结束时,j已回到i的前面,则flag置0,下一次结束while循环
j=0; //从第一个继续累加
}
}while(j!=i); //j==i说明循环一周,即所有城市都能够参观
cns=(j+n-i)%n;
if(cns==0)
cns=n;
if(cns>max)
max=cns;
i=j; //继续从结束点往后累加,计算能参观的最大城市数
}
A:printf("%d\n",max);
}
return 0;
}