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

ZOJ1161-Gone Fishing-greedy

2016-09-25 14:14 211 查看
题目大意:有一条单向的路,路上有n个鱼塘,可以钓鱼,每个鱼塘一开始可以钓到的鱼为fi,每次你在这个鱼塘钓完鱼的时候,这个鱼塘的fi就会减少di,问你要掉到最多的鱼的时候,在每个鱼塘所花的时间和最后钓到的鱼;

题目解析:我们可以枚举每一个鱼塘,表示结束时候的鱼塘,然后钓鱼的次数就是你的总时间减去到达这个鱼塘所花的时间,每次钓鱼的时候,我们只需要找到当前能钓到最多鱼的那个鱼塘就可以了,还要把当前钓过鱼的鱼塘的次数记录下来来维护plan;

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
int fish[33],det[33],t[33],plan[33],best;
void greedy(int pos,int time)
{
int i,id,ma,tempf[33],p[33],ta,j;
for(i=1;i<=pos;i++)
tempf[i]=fish[i];
memset(p,0,sizeof(p));
ta=0;
for(i=1;i<=time;i++)
{
ma=0;
id=-1;
for(j=1;j<=pos;j++)
if(tempf[j]>ma)
{
ma=tempf[j];
id=j;
}
if(id!=-1)
{
p[id]++;
ta+=tempf[id];
tempf[id]-=det[id];
}
if(id==-1)
{
p[1]+=1;
}
}
if(ta>best)
{
best=ta;
memset(plan,0,sizeof(plan));
for(i=1;i<=pos;i++)
plan[i]=p[i];
}
}
int main()
{
int i,h,n,cas,sum[33],flag;
scanf("%d",&cas);
while(cas--)
{
flag=0;
while(scanf("%d",&n)&&n)
{
scanf("%d",&h);
h*=12;
for(i=1;i<=n;i++)
scanf("%d",&fish[i]);
for(i=1;i<=n;i++)
scanf("%d",&det[i]);
sum[1]=0;
for(i=2;i<=n;i++)
{
scanf("%d",&t[i]);
sum[i]=sum[i-1]+t[i];
}
best=-1;
memset(plan,0,sizeof(plan));
for(i=1;i<=n&&h-sum[i]>0;i++)
{
greedy(i,h-sum[i]);
}
if(flag++)
printf("\n");
for(i=1;i<=n-1;i++)
printf("%d,",plan[i]*5);
printf("%d\n",plan
*5);
printf("Number of fish expected: %d\n",best);
}
if(cas)
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  greedy