您的位置:首页 > 编程语言 > Go语言

pku 1042 Gone Fishing

2010-07-31 14:57 162 查看
题意:钓鱼的问题,求能够钓到鱼的最大值。

算法分类:贪心+枚举。首先枚举是在一个湖,还是两个湖直到n个湖钓鱼,在每个过程中用贪心法对每次钓鱼进行讨论,然后就是每次的时间需要减去从一个湖到另外一个湖的所有的时间。

难点:首先是对输入的数据的判断:

第一个数指湖的个数。

第二个数指钓鱼的时间小时。

第三排的数据:每个湖能掉到好多鱼每5分种。

第四排的数据:每钓鱼一次,每五分钟能钓到鱼的减少的个数。

第五排的数据:从i到i+1个湖所用的时间,单位为5分钟。

输出:第一排每个湖所花费的时间(分钟),第二排:总的鱼数。

分析:这道题目弄懂了就很简单,但是很烦,然后注意的地方是当没有鱼钓的时候,剩下的时间都给第一个湖。

代码:

#include <iostream>
using namespace std;
int fish[28],jianshao[28],walktime[28],totaltime[28],tempfish[28];//walktime可以用一个数解决 可以不需要数组

int main()
{
int n;
int h;
int i,j,k,p;
int maxfish,sum;
int output[28],tempoutput[28];
while(scanf("%d",&n)!=EOF && n)
{
scanf("%d",&h);
h*=12;//单位是按照5分钟为单位的
maxfish = 0;
memset(output,0,sizeof(output));
for(i = 0;i < n; i++)
scanf("%d",&fish[i]);
for(i = 0;i < n; i++)
scanf("%d",&jianshao[i]);
totaltime[0]=0;
for(i = 1;i < n; i++)
{
scanf("%d",&walktime[i]);
totaltime[i]=totaltime[i-1]+walktime[i];//totaltime【】指到i个湖钓鱼所要减掉的行走时间
}
maxfish=0;

for(i = 1; i <=n; i++ )
{
memset(tempoutput,0,sizeof(tempoutput));

for(j = 0;j < i;j++)
tempfish[j]=fish[j];//一定要用tempfish保存 我就是在这wa了一次。因为下面的操作会对初始的数据进行破坏
sum=0;
for(j = 0; j < h - totaltime[i-1]; j++ )//j指的是能够钓鱼的次数
{
p=0;

for( k = 1;k < i; k++ )//寻找最大指所在的p位置
{
if(tempfish[k]> tempfish[p])
p=k;
}
if( tempfish[p] <= 0 )//最大值比0都还小了,所以将剩下的钓鱼次数都给第一个湖
{
tempoutput[0]+=h - totaltime[i-1] - j;
break;
}
sum+=tempfish[p];
tempfish[p]-=jianshao[p];
tempoutput[p] ++;
}
if(sum > maxfish)
{
maxfish = sum;
memcpy(output,tempoutput,sizeof(output));//可以百度百科一下这个函数,output是保存的最后输出的结果

}
if(sum == maxfish)//如果鱼的次数相同的时候,要求的是在最近的湖花费的时间最多。
{
for(k =0 ;k< i;k++)
if(output[k]!=tempoutput[k])
break;
if(tempoutput[k] > output[k])
memcpy(output,tempoutput,sizeof(tempoutput));

}

}
for(i = 0 ; i < n-1;i++ )//输出也是难点,但不是重点 注意最后是两个换行
printf("%d, ",output[i]*5);
printf("%d/nNumber of fish expected: %d/n/n",output[n-1]*5,maxfish);
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: