[解题报告]POJ1042 Gone Fishing

这题我是用枚举+贪心做的.对于大牛应该是一道简单的贪心题..但我还是做了很久才做出来...

这题的关键在于忽略路上的时间,先枚举要到达的编号最大的湖泊..假设走到的编号最大的湖是X,实际上这条路只用走一遍,剩下的时间都用来钓鱼.假设此时人可以瞬移,即可以瞬间选择1-X中的一个湖进行钓鱼.每次选择鱼最多的湖进行钓鱼,直到没有时间或者鱼全部被钓完为止.

 

import java.util.Arrays; import java.util.Scanner; public class GoneFish { public static void main(String[] args) { new GoneFish(); } public GoneFish(){ int fi[],ti[],di[],tempfi[]; Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); if(n==0)break; fi=new int[n];//总数 di=new int[n];//每五分钟减少的鱼数 ti=new int[n];//从i-1到i湖所花的时间 tempfi=new int[n]; int h=sc.nextInt(); h*=60;//总时间 for(int i=0;i<n;i++)fi[i]=sc.nextInt(); for(int i=0;i<n;i++)di[i]=sc.nextInt(); for(int i=1;i<n;i++)ti[i]=sc.nextInt()+ti[i-1]; int max=0; int ans[]=new int[n];//在每个湖钓鱼的时间 for(int i=0;i<n;i++){//枚举所到达的最大湖的情况 tempfi=Arrays.copyOf(fi, n); int tempans[]=new int[n]; int rtime=h-5*ti[i];//留给钓鱼的时间 int sum=0;//鱼的总数 while(rtime>0){//还有时间时 int maxv=0,maxindex=-1;; for(int j=0;j<=i;j++){//如果有鱼 if(tempfi[j]>maxv){maxindex=j;maxv=tempfi[j];} } if(maxindex==-1){//如果所有湖都没鱼了,将剩余时间留给第一个湖 tempans[0]+=rtime; break;} sum+=maxv; tempfi[maxindex]-=di[maxindex]; tempans[maxindex]+=5; rtime-=5; } if(sum>max){ ans=Arrays.copyOf(tempans,n); max=sum; } if(sum==max){//处理钓鱼数相等的情况 for(int j=0;j<n;j++){ if(tempans[j]<ans[j]){ break; } if(tempans[j]>ans[j]){ ans=Arrays.copyOf(tempans, n); max=sum; break; } } } rtime=h; } System.out.print(ans[0]); for(int i=1;i<n;i++){ System.out.print(", "+ans[i]); } System.out.println(); System.out.println("Number of fish expected: "+max); System.out.println(); } } }  

你可能感兴趣的:([解题报告]POJ1042 Gone Fishing)