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;
}
算法分类:贪心+枚举。首先枚举是在一个湖,还是两个湖直到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;
}
相关文章推荐
- pku1042 Gone Fishing
- PKU 1042 Gone Fishing
- pku 1042 Gone Fishing
- pku acm 1042 Gone Fishing
- PKU1042 gone fishing
- PKUOJ1042 Gone Fishing
- pku 1042 Gone Fishing
- POJ 1042 Gone Fishing【枚举+贪心】
- poj 1042 Gone Fishing
- POJ 1042 Gone Fishing (DP)
- POJ - 1042 Gone Fishing(钓鱼)(深搜+贪心)
- poj 1042 Gone Fishing
- POJ 1042 Gone Fishing
- POJ 1042 Gone Fishing
- POJ #1042 Gone Fishing - WA by a DP solution. TODO
- POJ 1042 Gone Fishing
- POJ 1042 Gone Fishing(钓鱼问题)__贪心
- POJ-1042:Gone Fishing
- 1042 Gone Fishing(枚举+贪心)
- UVa 757 / POJ 1042 / East Central North America 1999 Gone Fishing (枚举&贪心&想法题&优先队列)