有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[i] < R[i] <= 10000)
Output
输出执行所有任务所需要的最少空间。
Input示例
20 14 1 2 1 11 3 20 4 7 5 6 5 20 7 19 8 9 4 20 10 18 11 12 6 13 12 14 9 15 2 16 15 17 15 19 13 20 2 20 1
Output示例
135
一开始卡,然后自己写了个数据 (6,1) (5,1)(4,2)(3,1)(2,1)
这样画个图就出来了,是个贪心题。
首先先用b[i]=r[i]-o[i]进行排序,把大的排在前面,为什么是用差值来排序而不是用他们的r[i]来排序呢,因为这里也要对o[i]进行处理
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
struct rng{
int x,y,z;
}a[N];
bool cmp(rng q,rng p){
if(q.z!=p.z) return q.x>p.x;
return q.y>p.y;
}
int main(){
int i,j,n,m;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].z=a[i].x-a[i].y;
}
sort(a+1,a+1+n,cmp);
int sum=a[1].x;
int v=a[1].x-a[1].y;
for(i=2;i<=n;i++)
{
if(v<a[i].x){
sum+=a[i].x-v;
v=a[i].z;
}
else
v-=a[i].y;
}
cout<<sum<<endl;
return 0;
}