[贪心]任务执行顺序

https://www.51nod.com/tutorial/course.html#!courseId=23

题目大意:有$N$个任务需要执行,第$i$个任务计算时占$R[i]$个空间,而后会释放一部分,最后储存计算结果需要占据$O[i]$个空间$(O[i] < R[i])$。

例如:执行需要$5$个空间,最后储存需要$2$个空间。给出$N$个任务执行和存储所需的空间,问执行所有任务最少需要多少空间。

解题关键:按照$b[i]$不增的顺序排序,是最“有利”的。

一定注意:输入的不是a,b,而是O与R,比较的是b,两者的差的绝对值

结论:

如果对于$b[0] >  = b[1] >  =  \ldots  >  = b[x] < b[x + 1]$
$\left( {a[0],b[0]} \right) \ldots .\left( {a[x],{\rm{ }}b[x]} \right){\rm{ }}\left( {a[x + 1],{\rm{ }}b[x + 1]} \right)$的组合可以不产生负数,则我们交换$b[x]$和$b[x+1]$也可以不产生负数。

证明:
交换$(a[x],b[x])$和$(a[x + 1],b[x + 1])$对$x+1$更有利了,因为每个括号实际上是一个负数,所以越早安排这个括号,被减数就越大,就越不容易形成负数。

关键看$(a[x],b[x])$移动到后面会不会产生负数。

那其实是看之前的结果$ - a[x + 1] + b[x + 1] - a[x]$会不会产生负数,(注意$ - a[x + 1] + b[x + 1]$不会产生负数,因为我们刚才已经证明了,对$x + 1$更有利)

而我们知道之前的结果$-a[x] + b[x] – a[x + 1]$不会产生负数(因为我们的假设就是这样),而$b[x + 1] > b[x]$,所以前者更大,所以$-a[x + 1] + b[x + 1] – a[x]$不会产生负数。

因此我们证明了交换之后仍然不产生负数,也就是原先不产生负数,我们交换后仍然不产生负数。

而经过若干次这样的交换之后,我们肯定会把序列交换成按照b的不增顺序排序的。从而我们证明了,任何可行的方案都不好于按照b不增顺序排序的序列执行的方案,从而证明了我们的贪心策略是有效的。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct node{
 5     int a,b;
 6 }c[100002];
 7 bool cmp(node x,node y){
 8     return x.a-x.b>y.a-y.b;
 9 }
10 int main(){
11     int n;
12     cin>>n;
13     for(int i=0;i<n;i++)    cin>>c[i].a>>c[i].b;
14     sort(c,c+n,cmp);
15     int sum=c[0].a,tt=0;
16     for(int i=0;i<n;i++){
17         if(tt+c[i].a>sum) sum=tt+c[i].a;
18         tt+=c[i].b;
19     }
20     printf("%d",sum);
21     return 0;
22 }
时间: 2024-10-13 20:25:10

[贪心]任务执行顺序的相关文章

贪心基础入门讲解五——任务执行顺序

分析: 本题可以抽象成,从一个整数开始,每次减去a,再加上b (a,b都是正数),要求每次操作都不产生负数. 针对本题a[i] = R[i], b[i] = R[i] – O[i],注意O[i] < R[i],我们有0<b[i]<a[i]. 所以尽管每次有减有加,但是加的没有减的多,总数还是在不断见效的.关键我们是要“最有利”的一种执行顺序.大家可以尝试多种贪心策略. 我们给出标准答案——按照b[i]不增的顺序排序,是最“有利”的. 为了定义“有利”,我们这样证明我们的结论: 如果对于b

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

NAT与ACL执行顺序解析

防火墙数据包处理流程图 ACL与NAT的顺序不是固定的,各厂商数据流先ACL或先NAT不一. 引用<浅析ACL与NAT的执行顺序>-张少芳  一文中的结论如下: H3C 出站:先匹配出站ACL,然后进行地址转换 入站:先进行地址转换,然后匹配入站ACL CISCO 出站:先进行地址转换,然后匹配出站ACL 入站:先匹配入站ACL,然后进行地址转换(即上图所示数据流顺序) 结论 H3C设备和CISCO设备在对ACL与NAT的执行顺序处理上完全相反.由于在实际的网络中可能存在来自不同厂商的设备,因

Java(静态)变量和(静态)代码块的执行顺序

本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { System.out.println(word); } } 2.Parent类 public class Parent { static Foo FOO = new Foo("Parent's static parameter"); Foo foo = new Foo("Parent'

nginx与Lua执行顺序

Nginx顺序 Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序. Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 post-read.server-rewrite.find-config.rewrite.post-rewrite. preaccess.access.post-access.try-files.content.log. post-read: 读取请求内容阶段 Nginx读取并解析完请求头之后就立即

python 3 mysql sql逻辑查询语句执行顺序

python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <havin

TestNG学习-002-annotaton 注解概述及其执行顺序

此文主要讲述用 TestNG 基础的 annotation (注解)知识,及其执行的顺序,并通过一个 TestNG 简单的实例演示 annotation 的执行顺序. 希望能对初学 TestNG 测试框架的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! 言归正传,以下为 TestNG 常用的 annotation 及其释义,敬请参阅. @BeforeSuite:被此注解的方法将在所有测试运行之前运行该方法. @AfterSuite: 被此注解的方法将在所有测试运行之后运行该方法. @Bef

SQL的别名和SQL的执行顺序和SQL优化

SQL的别名 1.不可以在where子句中使用列名的别名,即select name t from emp where t>2999;是不允许的 2.使用别名的好处: 提高SQL的易读性 提高SQL的解析执行效率 语法检查 语义检查 共享池检查 生成执行树 执行 3.SQL的硬解析和软解析? SQL的执行顺序 1.from语句--where语句--group by语句--having语句--select语句--order by语句 rownum的使用 select * from emp rownu