程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1042 gone fishing

poj 1042 gone fishing

編輯:C++入門知識

這個題目是標准的貪心算法。題目的大體意思就是,現在給你一些水塘現在這個小孩在池塘1,現在開始釣魚,剛開始每個池塘有一定數目的魚,每次釣魚5分鐘魚的數目會相應的減少,當池塘當前的魚-每釣一次減少的數目<=0的時候下次將釣不到魚,當然池塘與池塘之間是有一定間隔的,這個間隔體現在時間上就是從i到i+1所花費的時間是ti當然這個ti*5才是真正的時間了。現在給你這個小孩能釣魚的時間求他最多能釣多少魚,並且要求輸出在每個池塘停留的時間。這個題目的做法就是如果我們知道了最後是在哪個池塘停止釣魚的,然後當然我們是一次走過去不會從i號池塘往回走,其余的時間全部都用來釣魚。現在的問題就是怎麼安排在這幾個池塘的釣魚時間,當然我們先是選擇出前5分鐘魚最多的池塘釣,然後這個池塘的魚減掉每次減少的魚的數目,然後下一個5分鐘繼續這種做法。要注意題目的輸出有個要求,導致必須要把最後停滯在第一個湖的這種情況單獨進行計算。還有這個題目隱含了一個意思,這些時間必須全部都耗盡,即使已經沒有魚可釣。

下面看程序。

[cpp]
<SPAN style="FONT-SIZE: 18px">#include<iostream> 
#include<stdio.h>  
using namespace std; 
int start[26],change[26],stay[26],compare[26],de[26],dis[26]; 
int main() 

    int n,h,i,time,sum,used,flag,maxi,j,jilu,sumc; 
    while(cin>>n) 
    { 
        if(n==0) 
            break; 
        cin>>h; 
        h=h*60; 
        for(i=1;i<=n;i++) 
            scanf("%d",&start[i]); 
        start[0]=0; 
        for(i=1;i<=n;i++) 
            scanf("%d",&de[i]); 
        for(i=1;i<n;i++) 
        { 
            scanf("%d",&dis[i]); 
            dis[i]=5*dis[i]; 
        } 
        dis[0]=0; 
        for(i=1;i<=n;i++) 
            stay[i]=0; 
        sum=0; 
        time=h; 
        change[1]=start[1]; 
        for(i=1;i<=n;i++) 
            stay[i]=0; 
        while(time>0) 
        { 
            sum=sum+change[1]; 
            change[1]=change[1]-de[1]; 
            if(change[1]<0) 
                change[1]=0; 
            time=time-5; 
            stay[1]=stay[1]+5; 
        } 
        used=0; 
        for(i=2;i<=n;i++) 
        { 
            sumc=0; 
            used=used+dis[i-1]; 
            time=h-used; 
            flag=1; 
            for(j=1;j<=n;j++) 
            { 
                change[j]=start[j]; 
                compare[j]=0; 
            } 
            while(time>0) 
            { 
                maxi=0; 
                jilu=1; 
                for(j=1;j<=i;j++) 
                { 
                    if(change[j]>maxi) 
                    { 
                        maxi=change[j]; 
                        jilu=j; 
                    } 
                } 
                sumc=sumc+maxi; 
                change[jilu]=change[jilu]-de[jilu]; 
                compare[jilu]=compare[jilu]+5; 
                if(change[jilu]<0) 
                    change[jilu]=0; 
                time=time-5; 
            } 
            if(sumc>sum) 
            { 
                sum=sumc; 
                for(int k=1;k<=n;k++) 
                    stay[k]=compare[k]; 
            } 
        } 
        for(i=1;i<n;i++) 
            cout<<stay[i]<<", "; 
        cout<<stay[n]<<endl; 
        cout<<"Number of fish expected: "<<sum<<endl<<endl; 
    } 
    return 0; 

</SPAN> 

#include<iostream>
#include<stdio.h>
using namespace std;
int start[26],change[26],stay[26],compare[26],de[26],dis[26];
int main()
{
 int n,h,i,time,sum,used,flag,maxi,j,jilu,sumc;
 while(cin>>n)
 {
  if(n==0)
   break;
  cin>>h;
  h=h*60;
  for(i=1;i<=n;i++)
   scanf("%d",&start[i]);
  start[0]=0;
  for(i=1;i<=n;i++)
   scanf("%d",&de[i]);
  for(i=1;i<n;i++)
  {
   scanf("%d",&dis[i]);
   dis[i]=5*dis[i];
  }
  dis[0]=0;
  for(i=1;i<=n;i++)
   stay[i]=0;
  sum=0;
  time=h;
  change[1]=start[1];
  for(i=1;i<=n;i++)
   stay[i]=0;
  while(time>0)
  {
   sum=sum+change[1];
   change[1]=change[1]-de[1];
   if(change[1]<0)
    change[1]=0;
   time=time-5;
   stay[1]=stay[1]+5;
  }
  used=0;
  for(i=2;i<=n;i++)
  {
   sumc=0;
   used=used+dis[i-1];
   time=h-used;
   flag=1;
   for(j=1;j<=n;j++)
   {
    change[j]=start[j];
    compare[j]=0;
   }
   while(time>0)
   {
    maxi=0;
    jilu=1;
    for(j=1;j<=i;j++)
    {
     if(change[j]>maxi)
     {
      maxi=change[j];
      jilu=j;
     }
    }
    sumc=sumc+maxi;
    change[jilu]=change[jilu]-de[jilu];
    compare[jilu]=compare[jilu]+5;
    if(change[jilu]<0)
     change[jilu]=0;
    time=time-5;
   }
   if(sumc>sum)
   {
    sum=sumc;
    for(int k=1;k<=n;k++)
     stay[k]=compare[k];
   }
  }
  for(i=1;i<n;i++)
   cout<<stay[i]<<", ";
  cout<<stay[n]<<endl;
  cout<<"Number of fish expected: "<<sum<<endl<<endl;
 }
 return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved