51NOD--1099 任务执行顺序--贪心思想

本文探讨了在给定多个任务及其所需计算和存储空间的情况下,如何通过算法计算执行所有任务所需的最少空间。提供了两种算法实现思路:一是求存储空间总和加上计算与存储差值的最小值;二是按计算与存储差值排序,动态调整所需空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1099 任务执行顺序

  1. 1.0 秒
  2.  
  3. 131,072.0 KB
  4.  
  5. 20 分
  6.  
  7. 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值