51nod 1099 任务执行顺序 (贪心算法)

题目:传送门

题意:中文题。

题解:r[i]-o[i]值大的先进行。反证法:如果大的后进行,会导致空间增大,所以一定大的是先进行。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
struct sa
{
    ll r,o,c;
} data[100005];
bool cmp(sa x,sa y) //注意这个排序方式 差值大的先进行
{
    return x.c>y.c;
}
int main()
{
    ll n;
    while(cin>>n)
    {
        for(int i=0; i<n; i++)
        {
            cin>>data[i].r>>data[i].o;//注意(O[i]<R[i])  这个很重要
            data[i].c=data[i].r-data[i].o;
        }
        sort(data,data+n,cmp);
        ll ans=0,tmp=0;
        for(int i=0; i<n; i++)
        {
            ans=max(ans,tmp+data[i].r);
            tmp+=data[i].o;
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-30 14:28:47

51nod 1099 任务执行顺序 (贪心算法)的相关文章

51Nod 1099 任务执行顺序 (贪心)

1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn =100000+5; 6 struct node{ 7 int r, q; 8 }a[maxn]; 9 10 bool cmp(node x, node y){ 11 if(x.r - x.q != y.r - y.q) 12 return (x.r-x.q) > (y.r-y.q); 13 return

51Nod - 1099 任务执行顺序

51Nod - 1099 任务执行顺序 有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i]). 例如:执行需要5个空间,最后储存需要2个空间.给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间. Input 第1行:1个数N,表示任务的数量.(2 <= N <= 100000) 第2 - N + 1行:每行2个数R[i]和O[i],分别为执行所需的空间和存储所需的空间.(1 <= O[

51nod 1449 砝码称重(贪心算法)

题目:传送门. 题意:中文题. 题解:左物右码,w进制.m%w==0||m%w==1||m%w==w-1都是可以的,否则是NO. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int main() { //左物右码 开始把物品放在左边 long long w,m;

51nod贪心算法教程

51nod确实是一个好oj,题目质量不错,wa了还放数据,学习算法来说挺好的,这次我做了几个水的贪心,虽然水,但是确实都很典型. 教程链接:http://www.51nod.com/tutorial/list.html 完美字符串 约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数.   约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同.给定一个字符串,输出它的最大可能的完美度.例如:dad,你可以将

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

分析: 本题可以抽象成,从一个整数开始,每次减去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

算法笔记_017:递归执行顺序的探讨(Java)

目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排序的序列问题,即共有n!次不同排序). 为此,我认真看了一篇出自CSDN上的博客文章,其中有一段核心代码就是在for循环里面添加一句递归调用语句,来实现n!次排序.因此,我对文章中的那段核心代码苦苦不得其解--其执行顺序究竟是咋样的呢? 附其简要代码: public int count = 0; p

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

贪心算法正确性证明(转载from刘子韬)

这里主要是介绍一种证明贪心算法是最优的一种方法:Exchange Argument (不知道应该怎么翻译到中文,交换参数?感觉听起来挺别扭的,不像是一个方法的名字~o(╯□╰)o) Exchange Argument的主要的思想也就是 先假设 存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立. 下面来看一个更为formal的解释: 步骤: Step0: 给出贪

Runnable接口和贪心算法

1 Runnable接口 Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现.设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议.激活的意思是说某个线程已启动并且尚未停止. 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口.实际上,Thread实现了Runnable接口. 2 贪心算法 贪心算法把问题分解为几个有顺序的子问题,逐一对子问题进行求解,每一步都是在已求解子问题的基础上求取最优解,是对已求解部分解的一个扩展,直到