【uva 1153】Keep the Customer Satisfied(算法效率–贪心+优先队列)

【uva 1153】Keep the Customer Satisfied(算法效率–贪心+优先队列)

大家好,又见面了,我是全栈君。

题意:有N个工作,已知每个工作需要的时间和截止时间。要求所有工作穿行完成,第一项任务开始的时间不早于时刻0。问最多能完成多少个工作。(N≤800000)

解法:贪心。可以模型化题目为:已知N个任务的长度和右端点的限制位置,问最多能完成的任务的个数。——也就是每一步在一定条件下要使得数目尽量大,以及时间尽量短(最优)。
   于是可以按截止时间(这就是条件●_●)从小到大排序,先考虑截止时间早的,暂时放入选择的队列中,加入其时间。接着对于当前新的工作,若按当前选择的工作的情况无法在截止时间之前完成这个工作,分2种情况讨论:(1)当前工作需要的时间比选择的队列中工作时间最长的还要长,就放弃这个工作,使完成相同数目工作的耗时尽量小;(2)工作时间比队列中时间最长的要短,就删去队列中时间最长的任务并且将当前的工作加入队列。–“最优子结构”  这样O(n)扫一次,加上使用优先队列,时间复杂度就是O(n log n)。

P.S.不能不判断就选了第一个……

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<iostream>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 
10 const int N=(int)8e5+10;
11 int n;
12 struct node{
   
   int d,t;}a[N];
13 priority_queue<int> q;
14 
15 bool cmp(node x,node y) {
   
   return x.t<y.t;}
16 int main()
17 {
18     int T;
19     scanf("%d",&T);
20     while (T--)
21     {
22       scanf("%d",&n);
23       for (int i=1;i<=n;i++)
24         scanf("%d%d",&a[i].d,&a[i].t);
25       sort(a+1,a+1+n,cmp);
26       while (!q.empty()) q.pop();
27       int sum=0,cnt=0;
28       for (int i=1;i<=n;i++)
29       {
30         if (sum+a[i].d<=a[i].t)
31         {
32           q.push(a[i].d);
33           sum+=a[i].d, cnt++;
34         }
35         else
36         {
37           if (q.empty()) continue;//
38           int x=q.top();
39           if (a[i].d<x)
40           {
41             sum=sum-x+a[i].d;
42             q.pop(),q.push(a[i].d);
43           }
44         }
45       }
46       printf("%d\n",cnt);
47       if (T) printf("\n");
48     }
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/konjak/p/6055552.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108787.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php将字符串内的指定字符全部替换,php中如何替换字符串中的某个字符[通俗易懂]

    php将字符串内的指定字符全部替换,php中如何替换字符串中的某个字符[通俗易懂]在PHP中,可以使用strtr()函数实现字符串替换。首先我们简单了解下strtr()函数的定义及语法。语法:stringstrtr(string$str,string$from,string$to)第一个参数表示待转换的字符串。第二个参数表示字符串中与将要被转换的目的字符to相对应的源字符。第三个参数表示字符串中与将要被转换的字符from相对应的目的字符。实例:…

    2022年5月23日
    37
  • tp5 $_ENV获取不到数据

    tp5 $_ENV获取不到数据

    2021年10月13日
    90
  • 基于matlab的声源定位系统_matlab电流源在哪

    基于matlab的声源定位系统_matlab电流源在哪##一、获取代码方式**获取代码方式1:**完整代码已上传我的资源:[【声源定位】基于matlab广义互相关声源定位【含Matlab源码548期】](https://download.csdn.net/download/TIQCmatlab/31339120)点击上面蓝色字体,直接付费下载,即可。**获取代码方式2:**[付费专栏语音处理(Matlab)](https://blog.csdn.net/tiqcmatlab/category_11941450.html)…

    2025年11月23日
    3
  • Java和JavaScript区别与联系

    Java和JavaScript区别与联系Java和JavaScript有啥区别,据说还有很多人不知道,来给大家科普一下两者区别!Java和JavaScript不同之处:1.用处不一样:它们最本质的不同就是用途:Java目前被广泛应用于PC端、手机端、互联网、数据中心等等;而JavaScript则被主要用于嵌入文本到HTML页面,读写HTML元素,控制cookies等。2.出身不同:Javascript与…

    2022年7月8日
    20
  • 程序员进外包后不好找工作吗_程序员去外包是不是就废了

    程序员进外包后不好找工作吗_程序员去外包是不是就废了在职场中选择公司非常重要,有些人为了贪图大公司名气,选择去干大公司的外包,但要知道外包跟正式员工,不管是收入还是从职业地位来说相差非常大,所以建议想去外包公司上班的请慎重。最近在职业论坛看到这样一个热门的帖子,“二本毕业,在华为外包工作3年,考虑跳槽却不收外包背景,怎么办”。到底怎么回事?请往下看。原来一位网友说,自己是二本毕业,到现在已经三年了,一直在华为外包,工作时间和华为正式工一样,每…

    2022年9月1日
    2
  • 爆笑三国之张飞流水账【爆笑中体验哲理】「建议收藏」

    爆笑三国之张飞流水账【爆笑中体验哲理】「建议收藏」
    张飞流水帐一
    我写这个流水帐的时候,大哥和二哥都在睡觉,军师也在睡觉。
    赤兔马站在我窗外,也在睡觉。
      小时侯我就研究马为什么会站着睡觉,研究了很长一段时间后,我发现没有答案。而苦恼的是我的童年唯一能记起的事就是这个了。

      长大以后有段时间我开始研究大哥和二哥为什么要睡在一张床上,同样也没有答案。
      这个世界有太多的事是没有答案的,军师对我说过。
      在我睁大眼睛思考问题的时候,我养成了睁眼睡觉的习惯,不

    2022年7月16日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号