关闭

UVA-1422(贪心+二分+优先队列)

141人阅读 评论(0) 收藏 举报
分类:

今天怕是石乐志。。。。

题目:UVA-1422

题目大意:给你n个任务,每个任务要在【l,r】的时间内完成w个工作量,注意坑点*就是这个任务可以分段完成,就是先完成一部分再在另外一个时间完成另一部分*,那么这题肯定是贪心,将完成时间靠前的先考虑,然后二分工作速度,就是每分钟做多少个工作量,然后枚举每一秒,在每一秒内,找到任务开始时间在这时间里的那些任务,优先做那些结束时间早的任务,所以要用优先队列维护。。。。

优先队列石乐志,一直不知道优先队列用结构体的时候要加重载函数,,

struct node
{
int l,r,s;
// bool operator < (const node & a) const {
// return r > a.r;
//}
bool operator<(const node &a)const
{
return r>a.r;//这里的意思就是r越小的在优先队列里越优先,别被>号误解
}
}p[10000+10];

代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
int n,max_;
struct node
{
    int l,r,s;
   // bool operator < (const node & a) const {
       // return r > a.r;
    //}
    bool operator<(const node &a)const
    {
        return r>a.r;
    }
}p[10000+10];
priority_queue<node>w;
bool cmp(node x,node y)
{
    if(x.l==y.l)
        return x.r<y.r;
    return x.l<y.l;
}
int judge(int mid)
{
    priority_queue<node>q;
    //queue<node>q;
    int cnt=0;
    for(int i=1;i<=max_;i++)//枚举每一秒直到某个任务的最大结束时间
    {
        while(p[cnt].l<i&&cnt<n)//把那些可以开始做的任务加入队列
            q.push(p[cnt++]);
        int res=mid;//res代表这一秒可以做的任务量
        while(res!=0&&!q.empty())
        {
            //node now=q.front();
            node now=q.top();
            q.pop();
            if(now.r<i)//如果这个任务的结束时间小于现在,但是它还在队列里,说明这个任务永远完成不了了,说明这个工作速度不行,可以返回了。
                return 0;
            if(now.s>res)//如果这个任务量大于这一秒可以做的量,那么还需要把这个任务加入队列,此时这一秒可以做的量都没了,都贡献给了这个任务
            {
                now.s-=res;
                res=0;
                q.push(now);
            }
            else//如果这个任务量小于这一秒可以做的量,那说明这个任务完成了,就不需要再加入队列了,但是这一秒可以做的量还有剩余,再拿去给别的任务用
            {
                res-=now.s;
            }
        }
    }
    if(cnt==n&&q.empty())//检查是否所有任务都被访问到了并且队列里没有任务了
        return 1;
    else
        return 0;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        //int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>p[i].l>>p[i].r>>p[i].s;
            max_=max(max_,p[i].r);
            //w.push(p[i]);
        }
//        while(!w.empty())
//        {
//            node u=w.top();
//            w.pop();
//            cout<<u.l<<" "<<u.r<<" "<<u.s<<endl;
//        }


        sort(p,p+n,cmp);
        int l=0,r=100000,mid;
        while(l<r)
        {
            mid=(l+r)/2;
            if(judge(mid))
                r=mid;
            else
                l=mid+1;
            //cout<<"l="<<l<<" "<<"r="<<r<<endl;
        }
        cout<<l<<endl;
    }
    return 0;
}
1
0
查看评论

贪心算法之——摘枇杷(nyoj680)(贪心+二分搜索)

问题: 摘枇杷 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 理工学院的枇杷快熟了,ok,大家都懂得。而且大家都知道,学校的枇杷树都是一列一列的。现在小Y同学已经在筹划怎么摘枇杷了。现在我们假设有一列枇杷树,而...
  • GreenHandCGL
  • GreenHandCGL
  • 2015-04-23 20:37
  • 759

nyoj 疯牛(二分搜索+贪心)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=586 疯牛 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述农夫 John 建造了...
  • y990041769
  • y990041769
  • 2014-02-19 17:44
  • 2102

poj2431Expedition(贪心,优先队列)

题意有一辆车,要开l的路,它每开一单位的路要消耗一单位的油。车里原来有p的油,车的油箱容量是无限大的。现在路上不同位置有一些加油站,这些加油站里有一定量的油,问开到终点最少要加几次油。思路我们肯定尽量加多一点的油,那么我们这样考虑,假如我经过一个加油站,我就获得了加这个站的油的权利,那么我可以一直走...
  • readlnh
  • readlnh
  • 2016-08-18 20:59
  • 527

|BZOJ 1650|二分|贪心|[Usaco2006 Dec]River Hopscotch 跳石子

BZOJ 1650 Luogu 2855 from: USACO 2006 Dec Sliver(USACO刷题第9题)最小值最大,显然二分。 二分最小值最大距离,然后贪心处理。 这里我们在头尾各增加一个石头,贪心时先从第一个石头开始记为ll,然后往后扫描,当前扫描的石头记为rr,如果st[...
  • Darost
  • Darost
  • 2017-06-15 19:28
  • 159

【NOIP2015】跳石头 (二分+贪心判定)

传送门 据说是一道USACO的原题,但我没做过…… 还好考场写出来了。思路十分简单,二分答案,过后直接判定就行了。 代码(考场上写的很丑……我甚至开了一个栈去保存有哪些节点……实际上只要保存最后一个就行了):#include<cstdio> const int MAXN = 500...
  • geng4512
  • geng4512
  • 2015-11-15 13:58
  • 2875

贪心+二分

疯牛 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述农夫 John 建造了一座很长的畜栏,它包括N (2 但是,John的C (2 输入有多组测试数据,以EOF结束。 第一行:空格分隔的...
  • GSD_liu
  • GSD_liu
  • 2017-07-05 11:28
  • 88

hrbust 1584 青蛙过河【二分查找+贪心】

青蛙过河 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 64(38 users) Total Accepted: 36(32 users) Rating:  Spe...
  • mengxiang000000
  • mengxiang000000
  • 2016-07-16 19:33
  • 760

//优先队列的插入与删除操作

//优先队列的插入与删除操作 #include using namespace std; const int maxsize=100; int a[maxsize]; void siftup(int v,int n) { if(n>=maxsize) { co...
  • maowenge
  • maowenge
  • 2014-09-29 15:32
  • 751

【简单贪心+优先队列】POJ - 1862 - Stripies

//一串数字,选取两个合并成一个=sqrt(a*b)*2,求最小得最后数字 //本来没意识到要最大两个开始组合。 #include<queue> #include<algorithm> #include<iostream> #include<cstdio&g...
  • suringer
  • suringer
  • 2017-03-29 18:37
  • 163

POJ 1505(二分+贪心)

题意:给一些书,这些书有不同的页数,让把这些书分成k份,必须是连续的,问这些份中页数和的最大值最小是多少。 解题思路:知道了页数和的范围,而且书都是连续的,要找到页数和最大值的最小值可以直接二分答案。。 AC: #include #include #include using namespac...
  • hexianhao
  • hexianhao
  • 2016-02-17 11:06
  • 202
    个人资料
    • 访问:13890次
    • 积分:884
    • 等级:
    • 排名:千里之外
    • 原创:76篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条