1099 任务执行顺序
- 1.0 秒
- 131,072.0 KB
- 20 分
- 3级题
有N个任务需要执行,第i个任务计算时占R[i]个空间,而后会释放一部分,最后储存计算结果需要占据O[i]个空间(O[i] < R[i])。
例如:执行需要5个空间,最后储存需要2个空间。给出N个任务执行和存储所需的空间,问执行所有任务最少需要多少空间。
收起
输入
第1行:1个数N,表示任务的数量。(2 <= N <= 100000) 第2 - N + 1行:每行2个数R[i]和O[i],分别为执行所需的空间和存储所需的空间。(1 <= O[i] < R[i] <= 10000)
输出
输出执行所有任务所需要的最少空间。
输入样例
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
输出样例
135
1、可以把存储的值加起来,然后找一个计算-存储的最小值加起来,就是最后答案。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1000000+66;
const ll mod=1e9+7;
struct node
{
int o;
int r;
int v;
}a[maxn];
bool cmp(const node&a,const node&b)
{
return a.v>b.v;
}
int main()
{
int n;
scanf("%d",&n);
int minn=9999999;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].r,&a[i].o);
minn=min(minn,a[i].r-a[i].o);
}
ll s=0;
for(int i=1;i<=n;i++)
{
s+=a[i].o;
}
int flag=0;
cout<<s+minn;
}
2、按照计算-存储排序
下一个任务所需要的空间大于上一个任务的r-0,就不需要扩大存储空间。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1000000+66;
const ll mod=1e9+7;
struct node
{
int o;
int r;
int v;
}a[maxn];
bool cmp(const node&a,const node&b)
{
return a.v>b.v;
}
int main()
{
int n;
scanf("%d",&n);
int minn=9999999;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].r,&a[i].o);
a[i].v=a[i].r-a[i].o;
}
sort(a+1,a+n+1,cmp);
ll s=a[1].r;
ll ans=a[1].r;
for(int i=1;i<=n;i++)
{
if(s<a[i].r)
{
ans+=(a[i].r-s);
s=a[i].r;
}
s-=a[i].o;
}
int flag=0;
cout<<ans;
}