列表

详情


NC235294. 任务

描述

今天公司有M项任务要完成。第i个任务需要x_i分钟才能完成。同时,这个任务有一个难度级别y_i。等级低于此任务的机器不能完成此任务。如果公司完成这项任务,他们将得到元报酬。
公司有N台机器。每台机器有一个最大的工作时间和等级。如果完成该任务的时间超过机器的最大工作时间,则机器不能完成该任务。每台机器一天只能完成一项任务。每一项任务只能由一台机器完成。
公司希望最大限度地增加他们今天能完成的任务的数量。如果有多种解决方案,他们希望最大化报酬。

输入描述

第一行包含两个整数NM。其中N是机器的数量,M为任务数
下面N行每行分别包含两个整数是机器能工作的最大时间。是机器的等级。
下面的M行分别包含两个整数是任务所需要的工作时间。是任务的等级。

输出描述

输出两个整数,公司今天能完成任务的最大数量和此情况下公司能得到的最大报酬。

示例1

输入:

1 2
100 3
100 2
100 1

输出:

1 50004

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 144ms, 内存消耗: 5880K, 提交时间: 2022-08-21 21:48:39

#include<bits/stdc++.h>
using namespace std;
struct aa{
    int x,y;
}a[100005],b[100005];
bool cmp(aa x,aa y){
    if(x.x==y.x)return x.y>y.y;
    else return x.x>y.x;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    for(int i=1;i<=m;i++)
        cin>>b[i].x>>b[i].y;
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+m+1,cmp);
    multiset<int>ss;
    int j=1;
    long long ans=0;
    int num=0;
    for(int i=1;i<=m;i++)
    {
        while(j<=n&&a[j].x>=b[i].x)
        {
            ss.insert(a[j].y);
            j++;
        }
        auto it=ss.lower_bound(b[i].y);
        if(it!=ss.end())
        {
            ans+=500*b[i].x+2*b[i].y;
            num++;
            ss.erase(it);
        }
    }
    cout<<num<<" "<<ans;
}

C++(clang++ 11.0.1) 解法, 执行用时: 126ms, 内存消耗: 5896K, 提交时间: 2023-07-08 19:52:15

#include <bits/stdc++.h>

using namespace std;

typedef struct ma {
    int x, y;
    bool operator< (const ma &p) const { return x==p.x?y>p.y:x>p.x;}
} ma;

int main() {
    int n, m;
    cin >> n >> m;
    ma a[n], b[m];
    for(int i=0;i<n;i++) cin >> a[i].x >> a[i].y;
    for(int i=0;i<m;i++) cin >> b[i].x >> b[i].y;
    sort(a, a+n);
    sort(b, b+m);
    multiset<int> ms;
    long long cnt = 0, ans = 0;
    for(int i=0,j=0;i<m;i++) {
        while(j<n&&b[i].x<=a[j].x) ms.insert(a[j++].y);
        auto it = ms.lower_bound(b[i].y);
        if(it!=ms.end()) cnt++, ans += 500*b[i].x + 2*b[i].y, ms.erase(it);
    }
    cout << cnt << ' ' << ans << endl;
}

上一题