poj 1042

题目链接:http://poj.org/problem?id=1042

此题是贪心+枚举

虽然说贪心和枚举在其他算法中算是简单的算法,但是它们合起来并不简单,代码又是的乱七八糟的

题解:

1.有题意可以看出,john直走即可,不必再走回来(因为浪费不必要的时间)

2.枚举走一个湖,两个湖,三个湖......n个湖;每次枚举中求出总时间,总时间以每5min递减,每次递减找出湖中鱼的数量最大的那个,加到sum中,然后更新鱼群

3.选出以上枚举的sum最大值及为题解,当然选出最大值的过程中要将时间记录下

#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
int main(int argc, char** argv) {

int n,h,i,f[26],d[26],t[26],time[26],tem[26],temt[26],j,k,max,max1,maxi,t1,flag,sum,left1,left;
while(scanf("%d",&n)&&n)
{
max1
=0;
left
=0;
scanf(
"%d",&h);
h
=h*60/5;
for(i=0;i<n;++i)
{
scanf(
"%d",&f[i]);
}
for(i=0;i<n;++i)
{
scanf(
"%d",&d[i]);
}
for(i=1;i<n;++i)
{
scanf(
"%d",&t[i]);
}
//输入
t[0]=0;

max1
=-1;
for(i=0;i<n;++i)//枚举第i个湖
{
left1
=0;
memset(temt,
0,sizeof(temt));
sum
=0;
if(h>=t[i])
h
-=t[i];
else
break;
t1
=h;
for(j=0;j<=i;j++)
{
tem[j]
=f[j];
}
while(t1>0)
{
maxi
=0;
flag
=1;
for(j=0;j<=i;++j)
{

if(maxi<tem[j])
{
max
=j;
maxi
=tem[j];
flag
=0;
}
}
if(flag!=0)
{
left1
=t1;
break;
}
t1
--;
temt[max]
++;//选出最大值,记录时间
sum+=tem[max];
if(d[max]>tem[max])
tem[max]
=0;
else
tem[max]
-=d[max];

}
if(sum>max1)
{
max1
=sum;
left
=left1;
for(j=0;j<26;++j)
{
time[j]
=temt[j];
}
}
}
time[
0]=time[0]+left;
for(j=0;j<n-1;j++)
printf(
"%d, ",time[j]*5);
printf(
"%d\n",time[j]*5);
printf(
"Number of fish expected: %d\n\n",max1);//输出,注意格式
}
return (EXIT_SUCCESS);
}

  

posted @ 2011-08-27 23:09  枫月寒  阅读(231)  评论(0编辑  收藏  举报