1153 - Keep the Customer Satisfied(贪心)

原创 2015年07月08日 19:41:05

又是一道经典的贪心算法题目 。 乍看题目,想到了紫书一开始讲的区间问题(给定一些区间,选择尽可能多的不相交区间),和另一个经典问题:“活动安排”  的实质是一样的。

但是本题又和区间问题不同,因为区间起点未知,我们所知道的仅仅是等待时间和截至时间,但是其实贪心思想是一致的,即:尽可能的给后面的人留下更多时间,满足当前所用时间最少。 因此可以写出贪心算法 : 按照截至时间排序,将元素的消耗时间加到优先队列里,这样队首元素就是消耗时间最长的人,如果加上当前的人时间超过了他的截至时间,那么将队首元素(队列中消耗时间最多的人)删除。

 不难发现对于该题,这样的做法是正确的。我们可以用反证法来加以证明:加入当前这个人之后,如果时间没有超出他的截止时间,那么这样是最好的。 如果超出了,那么肯定要牺牲一个人,为了给后面的人留出更多的时间,所以要删除消耗时间最长的人。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 800000 + 5;
int T,n;
struct node {
    int l,r;
}a[maxn];
bool cmp(node a,node b) {
    return a.r < b.r ;            //**
}
int main(){
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%d%d",&a[i].l,&a[i].r);
        sort(a,a+n,cmp);
        priority_queue<int> q;
        int ans = 0,time = 0;
        for(int i=0;i<n;i++) {
            q.push(a[i].l);
            int t = q.top();          //加入当前的人
            time += a[i].l;
            ans ++;
            if(time > a[i].r) { 
                time -= t;  q.pop(); ans --; //删除消耗时间最长的人,为后面的人留出更多的时间
            }
        }
        printf("%d\n",ans);
        if(T) printf("\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVa 1153 - Keep the Customer Satisfied(贪心)

给出订单需要时间和截止时间,求最多能完成多少,hint给了很详细的提示。 先按照截止日期排序,然后单次遍历,每次当前订单耗时小于之前订单最大值时,用当前订单替换耗时最长的订单,最终得到最优解。...
  • wcr1996
  • wcr1996
  • 2015年02月26日 22:45
  • 1233

UVa 1153 Keep the Customer Satisfied (贪心+优先队列)

题目链接:https://vjudge.net/problem/UVA-1153 题目大意:有n(n≤800000)个工作,已知每个工作需要的时间qi和截止时间di(必须在此之前完成),最多能完成多...
  • Interstellar_
  • Interstellar_
  • 2017年10月06日 17:48
  • 94

1153 - Keep the Customer Satisfied(贪心+优先队列)

Simon and Garfunkel Corporation (SG Corp.) is a large steel-making company with thousand of customer...
  • u011217342
  • u011217342
  • 2013年12月31日 21:07
  • 1022

UVa 1153 Keep the Customer Satisfied 解题报告(贪心)

1153 - Keep the Customer Satisfied Time limit: 3.000 seconds
  • kbdwo
  • kbdwo
  • 2014年07月23日 15:07
  • 476

uva 1153 - Keep the Customer Satisfied(贪心+优先队列)

题目链接:uva 1153 - Keep the Customer Satisfieduva 题目大意:有n个客户,去买一家商场,结算时候排队,每个顾客有一个等待时间,过了等待时间顾客就会不...
  • u011328934
  • u011328934
  • 2014年01月01日 16:37
  • 1232

UVA 1153 Keep the Customer Satisfied(贪心2.0)

题意给出每个工作的耗费时间(q)和截止日期(d),一个时间只能完成一个工作,问:最多可以完成几个工作。分析贪心的想法先按照 截止日期进行排序。 如果 t时间内完成了 k 个任务,那么如何去完成 k+...
  • baidu_33153085
  • baidu_33153085
  • 2016年10月01日 17:24
  • 112

Uva 1153 Keep the Customer Satisfied(贪心)

题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem...
  • wang2147483647
  • wang2147483647
  • 2017年10月05日 16:56
  • 397

UVA 1153 - Keep the Customer Satisfied

贪心  按d从小到大排序,res=0,每次res+=q,如果res超了就删掉前面的人中q最大的那个人 #include #include #include #include #include...
  • THE___BEST
  • THE___BEST
  • 2015年09月10日 14:32
  • 275

UVA 1153 Keep the Customer Satisfied

题意:有n个工作,已知每个工作需要的时间q和截止时间d(必须在此之前完成),最多能完成多少个工作?工作一次只能做一个,第一项工作的开始时间不早于0时刻 解题思路:贪心+优先队列.这道题目首先要注意的...
  • acm_xx
  • acm_xx
  • 2017年08月17日 09:21
  • 50

UVa 1153 - Keep the Customer Satisfied (贪心 + 优先队列)

题意 输出能完成的最大任务数 思路 一开始写了二分 + DFS,果断TLE。 后来想了很久也没想到什么好办法,参考了别人的思路。 这思路也挺神奇的,用优先队列维护...
  • u014247806
  • u014247806
  • 2014年11月08日 12:56
  • 503
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1153 - Keep the Customer Satisfied(贪心)
举报原因:
原因补充:

(最多只允许输入30个字)