`
king_tt
  • 浏览: 2259350 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 757 - Gone Fishing

 
阅读更多

【题目链接】

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_problem&problem=698



【原题】

John is going on a fishing trip. He hashhours available ($1 \leŸ h \leŸ 16$), and there arenlakes in the area ($2 \leŸ n \leŸ 25$) all reachable along a single, one-way road. John starts at lake 1, but he can finish at any lake he wants. He can only travel from one lake to the next one, but he does not have to stop at any lake unless he wishes to. For each$i = 1, \dots, n- 1$, the number of 5-minute intervals it takes to travel from lakeito lakei+ 1 is denotedti($0 < t_i \leŸ 192$). For example,t3= 4 means that it takes 20 minutes to travel from lake 3 to lake 4.


To help plan his fishing trip, John has gathered some information about the lakes. For each lakei, the number of fish expected to be caught in the initial 5 minutes, denotedfi($f_i \ge– 0$), is known. Each 5 minutes of fishing decreases the number of fish expected to be caught in the next 5-minute interval by a constant rate ofdi($d_i \ge– 0$). If the number of fish expected to be caught in an interval is less than or equal todi, there will be no more fish left in the lake in the next interval. To simplify the planning, John assumes that no one else will be fishing at the lakes to affect the number of fish he expects to catch.


Write a program to help John plan his fishing trip to maximize the number of fish expected to be caught. The number of minutes spent at each lake must be a multiple of 5.

Input

You will be given a number of cases in the input. Each case starts with a line containingn. This is followed by a line containingh. Next, there is a line ofnintegers specifyingfi($1 \leŸ i \leŸ n$), then a line ofnintegersdi($1 \leŸ i \leŸ n$), and finally, a line ofn- 1 integersti($1 \leŸ i Ÿ\le n - 1$). Input is terminated by a case in whichn= 0.

Output

For each test case, print the number of minutes spent at each lake, separated by commas, for the plan achieving the maximum number of fish expected to be caught (you should print the entire plan on one line even if it exceeds 80 characters). This is followed by a line containing the number of fish expected. If multiple plans exist, choose the one that spends as long as possible at lake 1, even if no fish are expected to be caught in some intervals. If there is still a tie, choose the one that spends as long as possible at lake 2, and so on. Insert a blank line between cases.

Sample Input

2
1
10 1
2 5
2
4
4
10 15 20 17
0 3 4 3
1 2 3
4
4
10 15 50 30
0 3 4 3
1 2 3
0

Sample Output

45, 5
Number of fish expected: 31

240, 0, 0, 0
Number of fish expected: 480

115, 10, 50, 35
Number of fish expected: 724


【分析与总结】

超级经典的一道贪心题,LRJ黑书上贪心章节的第一道例题。



我是用堆来实现的。


【代码】

/*
 * UVa: 757 - Gone Fishing
 * Greedy
 * Time: 0.044s(UVa), 79MS(poj)
 * Author: D_Double
 *
 */
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define MAXN 30
using namespace std;
int h,n;
int ans[MAXN], tmp[MAXN];

struct Node{
    int no;        // 第几号湖
    int rate;      // 每5分钟钓的鱼
    int down;      // 每5分钟减少的钓鱼数量
    int time;      // 从第一个湖走到当前这个湖的时间
    friend bool operator < (const Node&a,const Node&b){
        if(a.rate!=b.rate)
            return a.rate<b.rate;
        return a.no>b.no; // 如果每5分钟钓的鱼相同,优先序号钓小的湖
    }
}arr[MAXN];

priority_queue<Node>que;

void greedy(){
    int maxSum=-10000;
    for(int i=0; i<n; ++i){ // 枚举钓1~i个湖的情况
        while(!que.empty()) que.pop();
        for(int j=0; j<=i; ++j) que.push(arr[j]);

        int leftTime=h*60-arr[i].time, sum=0;
        memset(tmp, 0, sizeof(tmp));

        while(leftTime > 0){
            Node temp=que.top();
            que.pop();
            if(temp.rate<=0) break;
            sum += temp.rate;
            temp.rate -= temp.down;
            tmp[temp.no] += 5;
            que.push(temp);
            leftTime -= 5;
        }  
        if(leftTime>0) tmp[0] += leftTime; // 注意把剩下的时间都加到第一个湖上
        if(sum > maxSum){
            maxSum=sum;
            for(int j=0; j<n; ++j)
                ans[j]=tmp[j];
        }
    }
    printf("%d",ans[0]);
    for(int i=1; i<n; ++i)
        printf(", %d",ans[i]);
    printf("\n");
    printf("Number of fish expected: %d\n", maxSum);
}


int main(){
    bool flag=false;
    while(~scanf("%d",&n)&&n){
        scanf("%d",&h);
        for(int i=0; i<n; ++i){
            scanf("%d",&arr[i].rate);
            arr[i].no = i;
        }
        for(int i=0; i<n; ++i){
            scanf("%d",&arr[i].down);
        }
        arr[0].time=0;
        for(int i=1; i<=n-1; ++i){
            int t;
            scanf("%d",&t);
            arr[i].time = arr[i-1].time+t*5;
        }
        if(flag)printf("\n");
        else flag=true;
        greedy(); 
    }
    return 0;
}


—— 生命的意义,在于赋予它意义。

原创http://blog.csdn.net/shuangde800By D_Double (转载请标明)



分享到:
评论

相关推荐

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    Uva 1510 - Neon Sign

    ### Uva 1510 - Neon Sign #### 问题背景与描述 在题目“Uva 1510 - Neon Sign”中,我们面对的是一个霓虹灯招牌设计问题。该霓虹灯招牌由一系列位于圆周上的角点组成,并通过发光管连接这些角点。发光管有两种...

    uva705-Slash-Maze-.rar_Slash_uva705

    【标题】"uva705-Slash-Maze-.rar_Slash_uva705" 指向的是一个在UVa Online Judge (UVa OJ) 上提交并通过的编程问题,具体为问题编号705,名为"Slash Maze"。这个压缩包很可能包含了该问题的解决方案源代码。 ...

    UVA100~200---52道题accept代码,均顺利accept过

    这些文件名代表的是在UVA(University of Virginia)在线判题系统上解决的编程题目,主要是C++语言编写的解决方案。UVA是一个知名的在线编程竞赛平台,它提供了大量的算法问题供程序员挑战,有助于提高编程技能和...

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...

    Algorithm-UVA-Solutions-in-Python.zip

    "Algorithm-UVA-Solutions-in-Python.zip"这个压缩包文件正是针对UVA竞赛中问题的Python 3解决方案集合。 Python作为一门易学且功能强大的编程语言,因其简洁的语法和丰富的库支持,成为了许多算法爱好者和开发者的...

    uva532-Dungeon-Master.rar_dungeon

    《UVA532 Dungeon Master:解密游戏编程的深度探索》 在计算机科学与编程领域,UVA(University of Virginia)在线判题系统是一个深受程序员喜爱的平台,它提供了丰富的算法题目供学习者挑战。其中,编号为532的...

    tpcw-nyu-uva-client 客户端

    "tpcw-nyu-uva-client 客户端"是一个专为TPCW(Transaction Processing Performance Council Workloads)设计的应用程序,由纽约大学(NYU)和弗吉尼亚大学(UVA)共同开发。这个客户端软件主要用于模拟和评估数据库...

Global site tag (gtag.js) - Google Analytics