POJ 1042 Gone Fishing【枚举+贪心】
生活随笔
收集整理的這篇文章主要介紹了
POJ 1042 Gone Fishing【枚举+贪心】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意: 有 n 個池塘,只能從第一個池塘開始走,可以在每個池塘中釣魚,而且知道了每個池塘每五分鐘釣魚的數量都會下降一定額數值,且從池塘到下一個池塘之間都有一定的距離,知道了每個池塘走到下一個池塘的時間和每個池塘一開始能夠釣魚的數量,求在規定的時間內所能釣的最多的魚的數量。
分析: 枚舉以每個池塘為終點的情況,找到最大值。
????????? 有個注意的地方就是,沒枚舉一個終點,先把這段路的每個間隔所花時間去掉,這樣就可以每次貪心去找單位時間可以釣最多的魚了,而且可以保證貪心到最后可以找到最優解。
#include<cstdio> #include<cstring> #define clr(x)memset(x,0,sizeof(x)) struct node {int f; // 開頭 5 分鐘釣的魚數量 int d; // 每五分鐘減少的數量int dis; // 到下一個池塘的時間 }l[202]; int a[202]; // 保存每個池塘一開始可以釣的魚 int tim[202][2500]; int res[202]; int main() {int n,i,j,k,t,tot,tt,max;while(scanf("%d",&n),n){clr(a);clr(tim);clr(res);scanf("%d",&t);tot=t*12;for(i=0;i<n;i++)scanf("%d",&l[i].f);for(i=0;i<n;i++)scanf("%d",&l[i].d);for(i=0;i<n-1;i++)scanf("%d",&l[i].dis);for(i=0;i<n;i++){t=tot;for(j=0;j<i;j++)t-=l[j].dis;for(j=0;j<=i;j++)a[j]=l[j].f;for(j=0;j<t;j++){max=a[0];tt=0;for(k=0;k<=i;k++)if(a[k]>max){max=a[k];tt=k;}a[tt]-=l[tt].d;res[i]+=max;if(a[tt]<0)a[tt]=0;tim[i][tt]++;}}max=res[0];tt=0;for(i=1;i<n;i++)if(res[i]>max){max=res[i];tt=i;}for(i=0;i<n-1;i++)printf("%d, ",tim[tt][i]*5);printf("%d\n",tim[tt][i]*5);printf("Number of fish expected: %d\n\n",max);}return 0; }?
?
轉載于:https://www.cnblogs.com/dream-wind/archive/2012/07/27/2612598.html
總結
以上是生活随笔為你收集整理的POJ 1042 Gone Fishing【枚举+贪心】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本地windows主机无法访问虚拟机里主
- 下一篇: 两道图片隐写的CTF题