您的位置:首页 > 其它

POJ 1042

2016-02-14 22:09 211 查看
题意:

John去钓鱼,在一个单向的很多条湖的路边钓鱼,每条湖每5分钟能钓到的鱼的数量随着时间减少,每条湖之间的行走时间也是不同的,但是固定不变。问的是,给出总的时间h小时,编写算法,求出能钓到最多的鱼的解决方案。

输入:湖的数量,给定的总时间,每条湖头5分钟能钓到的数量,每条湖钓鱼的衰减速率,每两条湖之间的行走时间

输出:每条湖上 钓鱼的时间,以及最大的钓鱼的数量

分析:枚举算法 加上 贪心算法

首先,无论选择哪种方案,最后John肯定会有一条最后钓鱼的湖。所以,最终方案肯定是以下方案的一个:在第i条湖收工(i=1,2,3,4……n).

以上是枚举,枚举中每一种情况之后,再看看下一个5分钟,哪一条湖能钓的鱼最多,就选择哪条湖,“瞬间转移”,这样持续下去,直到把时间耗尽

这就是贪心算法,每次选择最优的方案。

如果出现负数,时间全部累加到 第一条湖 上;当出现钓鱼最多的方案有多个时,将前几个湖中耗时最长的找出来就可以了。

最后要注意的是,输出格式。(一个空格花了我好久才AC)

#include<iostream>
#include<cstring>
#define MAX 26
using namespace std;

int t[MAX],f[MAX],F[MAX],d[MAX],ans[MAX],ANS[MAX]; //ANS为最终在每条湖上的停留时间

int main(){
    int i,j,k,h,time,n,p,sum,max;
    memset(t,0,sizeof(t));
    while(cin>>n&&n!=0){
        cin>>h;
        h = h * 12;
        for(i=0;i<n;i++)
            cin>>F[i];
        for(i=0;i<n;i++)
            cin>>d[i];
        for(i=1;i<n;i++){
            cin>>time;
            t[i] = time + t[i-1];
        }
        memset(ANS,0,sizeof(ANS));
        for(max=0,i=1;i<=n;i++){
            memset(ans,0,sizeof(ans));
            for(k=0;k<i;k++)
                f[k] = F[k];
            for(sum=0,j=0;j<h-t[i-1];j++){
                for(p=0,k=1;k<i;k++){
                    if(f[k]>f[p])
                        p = k;
                }
                if(f[p]<=0){
                    ans[0]+= h - t[i-1] - j;
                    break;
                }
                sum += f[p];
                f[p] -= d[p];
                ans[p]++;
            }
            if(sum>max){
                max = sum;
                memcpy(ANS,ans,sizeof(ans));
            }
            if(sum == max){
                for(j=0;j<i;j++){
                    if(ans[j]!=ANS[j])
                        break;
                }
                    if(ans[j]>ANS[j]){
                        memcpy(ANS,ans,sizeof(ans));
                }
            }
        }
        for(i=0;i<n;i++){
            if(i==n-1){
                cout<<ANS[i]*5<<endl;
                break;
            }
            cout<<ANS[i]*5<<", ";
        }
        cout<<"Number of fish expected: "<<max<<endl<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: