题目大意:工程师要安装n个任务,其中第i个服务Ji需要si单位的安装时间,截止时间为di,如果在截止时间之前完成任务,不会有任何惩罚,否则惩罚值为任务完成时间与截止时间之差,你的任务是让惩罚值最大的两个任务的惩罚之和最小

解题思路:这题很容易就想到按di进行排序,di小的先做,如果di相同的话,就si小的先做,这样的思路是正确的,能保证大局的最优化,但是这样无法保证惩罚值最大的两个任务的惩罚值之和达到最小,因为有可能以牺牲一个任务的代价使得结果发生变化。这里的话,就要考虑一下要牺牲的任务在哪个位置了。

牺牲的任务只能在两个最大惩罚值中的最后一个任务的前面,只有牺牲前面的任务才能使最大惩罚值的值减小,注意这里是牺牲,就表示有可能牺牲这个任务后,该任务的惩罚值变成了最大惩罚值的其中一个。

#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 510
struct Task{int s, d;bool operator <(const Task t) const{if(t.d == d)return s < t.s;elsereturn d < t.d;  }
}T[maxn];
int pos, n;int solve(int cur) {int MAX1 = 0, MAX2 = 0, sum = 0;for(int i = 0; i <= pos; i++) {if(i == cur)continue; sum += T[i].s;if(sum - T[i].d >= MAX2) MAX2 = sum - T[i].d;if(MAX2 > MAX1)swap(MAX1,MAX2);}sum += T[cur].s;if(sum - T[cur].d >= MAX2)MAX2 = sum - T[cur].d;if(MAX2 > MAX1)swap(MAX1,MAX2);for(int i = pos + 1; i < n; i++) {sum += T[i].s;if(sum - T[i].d >= MAX2)MAX2 = sum - T[i].d;if(MAX2 > MAX1)swap(MAX1,MAX2);}return MAX2 + MAX1;
}int main() {int test;scanf("%d",&test);while(test--) {scanf("%d",&n);for(int i = 0; i < n; i++)scanf("%d%d",&T[i].s, &T[i].d);sort(T,T+n);int cur = 0, MAX1 = 0, MAX2 = 0, t = 0;for(int i = 0; i < n; i++) {cur += T[i].s;if(cur - T[i].d >= MAX2) {MAX2 = cur - T[i].d;pos = i;   }if(MAX2 > MAX1)swap(MAX1,MAX2);}int ans = MAX1 + MAX2;for(int i = 0; i < pos; i++)ans = min(ans,solve(i));printf("%d\n",ans);}return 0;
}

UVALive - 4850 Installations 贪心+枚举相关推荐

  1. UVALive 4850 Installations 贪心

    题目链接  题意 工程师要安装n个服务,其中服务Ji需要si单位的安装时间,截止时间为di.超时会有惩罚值,若实际完成时间为ci,则惩罚值为max{0,ci-di}.从0时刻开始执行任务,问惩罚值最大 ...

  2. UVALive 4850 Installations——思维

    按d排序保证最大惩罚最小,但是此时次大惩罚+最大惩罚不一定最小,可以牺牲一个任务使得最大惩罚增大,次大惩罚减小使得最终答案减小 #include <bits/stdc++.h> using ...

  3. CodeForces - 803C Maximal GCD(贪心 + 枚举)

    链接一 链接二 You are given positive integer number n. You should create such strictly increasing sequence ...

  4. D. Boboniu Chats with Du (664 div2 贪心 枚举)

    D. Boboniu Chats with Du 题意: 给 n 个快乐值,你可以按任何顺序在群里说出快乐值为 kik_iki​ 的话,当 m<kim<k_im<ki​ 时,你会获得 ...

  5. UVa1467 Installations(贪心)

    问题:已经n安装任务,知道每个任务完成所需时间serveTime及截止时间deadline,任务的惩罚时间定义为完成时间减去截止时间,要求最大惩罚时间和次在惩罚时间之和最小. 思路:使用贪心算法,将n ...

  6. I - Defeat the Enemy UVALive - 7146 二分 + 贪心

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. UVA 1616 Caravan Robbers 【二分+贪心+枚举分母】

    题目链接 题意 给n个互不相包含的区间,求出一个长度的最大值,使得可以在每个区间中选出这样一个长度的子区间,这些子区间互不相交.结果用分数表示 分析 先考虑如果给定了区间长度能不能选出这样的区间.因为 ...

  8. Codeforces 1395 D. Boboniu Chats with Du(贪心枚举答案)

    传送门 题意: 思路: 先把大于m的放在b数组,小于m的放在a数组 枚举一下最终结果中用了几个b,取一个最大值即可 看代码应该能明白(有注释) 代码: int a[MAXN],b[MAXN]; ll ...

  9. P2102 地砖铺设(dfs贪心)

    P2102 地砖铺设(dfs&贪心) 枚举每个点作为正方形左上角进行扩展,只需对左边界和上边界进行判断即可,然后正方形填充.因为要求最小,所以每次就特判右上角的点是否能更小,如果不行就brea ...

最新文章

  1. 吴恩达老师,被曝靠「教书」实现首个IPO上市,估值50亿美元
  2. Kimera:一个基于度量语义的SLAM开源库
  3. iOS 性能优化-启动优化、main函数之前优化-二进制重排
  4. 《机器人学经典教程》——2.3 人工智能
  5. 898. 子数组按位或操作
  6. js实现html页面倒计30秒,javascript实现简单页面倒计时
  7. Eclipse-cvs指南
  8. 女生心中的理想男生!这些条件你符合几条?
  9. Docker 网络命名空间
  10. 图解Android - Android GUI 系统 (1) - 概论
  11. 前端获取本地ip和外网ip
  12. 第七章、Tiny4412 U-BOOT移植七 DDR内存配置
  13. 01 ArcGIS空间分析--水文分析--利用水文分析方法提取山谷山脊线
  14. android发送http post请求函数带参数带返回数据 静态类 源码
  15. 拼多多店铺如何快速装修?
  16. UG二次开发 创建圆柱和简单孔UF_MODL_create_simple_hole
  17. 使用 OpenSSL 加密和解密文件
  18. 神经网络量化入门--基本原理
  19. workbench设置单元坐标系_节点坐标系:很多Workbench结构用户不知道的重要概念
  20. C语言画奥运五环以及五角星

热门文章

  1. 迷你世界支持服务器,迷你世界测试服务器
  2. 关于楼板和梁分割的基本内容
  3. LaTeX 学术报告PPT(附代码)—通过潜在因子模型对混合型数据差分私有化
  4. Python+Qt掌纹识别
  5. [服务器图片上传demo]
  6. 用PHP实现虎牙压豆稳赚不赔的方法
  7. 用计算机说早上好,早上好的句子:每日早上好问候语经典句子
  8. 二叉树中序遍历Stack实现
  9. 政企办公新入口,华为云桌面安全便捷更高效!
  10. 苹果M1芯片怎么样---苹果M1参数与测评