题目大意:去捕鱼

约翰去参加一个垂钓旅行,他有h小时可以使用在该地区有n (2 <= n <= 25) 个湖泊可以沿着一个单一的路到达,约翰从湖泊1开始,但是它可以在任何湖泊结束他如果想,他仅仅只可以从一个湖到另一个湖,除非他想否则不会停留在任何湖泊,对于每个i=1,......,n-1,每间隔5分钟,都会从湖i到湖i+1来表示为ti( 0 < ti <=192),例如t3=4,意思就是将会花费20分钟时间从湖3到湖4,帮助约翰完成这次钓鱼旅行,约翰收集了一些关于湖泊的信息,对于每个湖i,在最初的5分钟能捕到鱼的数目,表示为fi(fi>=0),已经知道,每过5分钟钓的鱼的数量都会减少di(di>=0),如果鱼的数量在接下来的时间间隔内小于等于di,在接下来的时间内将没有鱼出现,为了简化问题,约翰认为没有别的人捕鱼影响他捕鱼的数量。
写一个程序帮助约翰可以捕到最多的鱼,在每个湖泊里面花费的时间必须是5的倍数。
用优先队列取每个阶段的最大值
#include<stdio.h>
#include<queue>
using namespace std; #define maxn 30 struct node
{
    int fi, di, index, p;
    friend bool operator < (node n1, node n2)
    {
        if(n1.fi != n2.fi)
            return n1.fi < n2.fi;
        return n1.index > n2.index;
    }
}; void Solve(int ans[], node a[], int n, int *Max, int Time); int main()
{
    int n, t=0;     while(scanf("%d", &n), n)
    {
        int i, H, Max=-1, ans[maxn]={0}, ti[maxn]={0}, time=0;
        node a[maxn];         scanf("%d", &H);         H = H*12;         for(i=0; i<n; i++)
            scanf("%d", &a[i].fi);
        for(i=0; i<n; i++)
        {
            scanf("%d", &a[i].di);
            a[i].index = i;
            a[i].p = 0;
        }
        for(i=1; i<n; i++)
            scanf("%d", &ti[i]);         for(i=0; i<n; i++)
        {
            time += ti[i];
            Solve(ans, a, i+1, &Max, H-time);
        }         if(t)printf("\n");t++;         for(i=0; i<n; i++)
            printf("%d%s", ans[i]*5, i==n-1?" \n":", ");
        printf("Number of fish expected: %d\n", Max);
    }     return 0;
}
void Solve(int ans[], node a[], int n, int *Max, int Time)
{
    int i, sum=0;
    priority_queue<node> Q;
    node s;     for(i=0; i<n; i++)
    {
        s = a[i];
        Q.push(s);
    }     if(Time < 0)return ;     while(Time)
    {
        Time--;         s = Q.top(), Q.pop();
        sum += s.fi;
        s.fi -= s.di, s.p++;
        if(s.fi < 0)
            s.fi = 0;
        Q.push(s);
    }     if(*Max < sum)
    {
        while(Q.size())
        {
            s = Q.top(), Q.pop();
            ans[s.index] = s.p;
        }
        *Max = sum;
    }

}

poj1042的更多相关文章

  1. poj1042(贪心+枚举)

    题目链接:https://vjudge.net/problem/POJ-1042 题意:给n个湖,给出每个湖第一次打捞时鱼的数量f[i],每单位时间鱼减少的数量d[i],从湖i到湖i+1用时t[i], ...

  2. POJ1042 Gone Fishing

    采用贪心策略. 假设他从1湖泊走到x 湖泊,这还剩下 h*12 - sigma(T1--Tx-1).(单位时间为5分钟).然后再用剩下的时间去钓1-x的湖泊的鱼. 每次都选择最多鱼的湖泊钓. code ...

  3. poj1042题解

    h [1,16] hours all_v=h*12 intervals n [2,25] lakes fi inital intervals fi-di*v v [0,all_v) 题意,做每件事情的 ...

  4. POJ1042 贪心钓鱼

    题意:       你有H小时(H*12个单位)时间去用,有n个鱼池在一条直线上,一开始你在1的位置,可以选择在某些鱼池上钓鱼,但是如果持续在一个鱼池上钓鱼钓鱼速度回成线性减少,初始每个时间单位钓fi ...

  5. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

  6. 暑假集训Chapter1 贪心

    为什么要今天写呢? 明天全力研究Johnson和一些奇奇怪怪的贪心 今天把能写的都写了 T1T2太水了直接上代码吧 #include<bits/stdc++.h> #define LL l ...

随机推荐

  1. 无软驱加载raid驱动安装windows2003及其他微软操作系统

    [转载]http://blog.zol.com.cn/2650/article_2649199.html [另一篇]http://www.blue1000.com/bkhtml/c159/2013-0 ...

  2. shell脚本学习之if..else用法

    一 简介 1 字符串判断 str1 = str2 当两个串有相同内容.长度时为真  str1 != str2 当串str1和str2不等时为真  -n str1 当串的长度大于0时为真(串非空)  - ...

  3. iOS 去除导航栏下的黑线

    Swift: navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default) na ...

  4. 10集合:List<T>,Dictionary<K,V>

    List<T>泛型集合 List<T>是C#中一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性.   1.List<T>用法 ...

  5. asp.net尽量不在js里写<%%>

    asp.net尽量不在js里写<%%> eg: <script type="text/javascript"> var rootsid="&quo ...

  6. spl_autoload_register()和__autoload()

    关于spl_autoload_register()和__autoload() 看两者的用法: //__autoload用法 function __autoload($classname) {     ...

  7. (转载)无缝滚动图片的js和jquery两种写法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 数组去重的三种方法及from方法

    直接上代码: var str="adbbckddwerivka"; var arr=str.split(""); console.log(arr); //ind ...

  9. php多条件组合查询

    1. 通过表单把查询条件提交到php文件中,在文件中以post的形式得到传送过来的条件. 2. 把传过来的查询条件赋给变量. 3. 判断如果查询条件非空,则拼接查询sql. 大体如下: 1. < ...

  10. 快速傅里叶变换(FFT)

    一.FFT的意义 DFT虽然实现了FT的计算机计算,但是计算量大,不适合实时的数字信号处理.FFT算法的出现,使DFT的计算效率更高,速度更快. 二.FFT与DFT的关系 从FT到DFT经过了数字角频 ...