您的位置:首页 > 其它

hdu 1422 DP

2015-09-02 15:30 169 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1422

自我感觉本题算是一道有点技术含量的DP题,思路同To the max那题很类似,用一个一维数组存储提供的生活费和所需的花费,可惜当时我没想到,虽然也用了DP思想,但是用了两个数组存储,又用了结构体,比较麻烦,最后程序写的老长,自己都快写晕了,交上自然也就免不了wa的厄运了!

AC代码:

#include<stdio.h>
#define N 100010
int a
;   //记录第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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: