安排机器

小Q的公司最近接到m个任务, 第i个任务需要xi的时间去完成, 难度等级为yi。
小Q拥有n台机器, 每台机器最长工作时间zi, 机器等级wi。
对于一个任务,它只能交由一台机器来完成, 如果安排给它的机器的最长工作时间小于任务需要的时间, 则不能完成,如果完成这个任务将获得200 * xi + 3 * yi收益。

对于一台机器,它一天只能完成一个任务, 如果它的机器等级小于安排给它的任务难度等级, 则不能完成。

小Q想在今天尽可能的去完成任务, 即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

输入描述:

输入包括N + M + 1行,
输入的第一行为两个正整数n和m(1 <= n, m <= 100000), 表示机器的数量和任务的数量。
接下来n行,每行两个整数zi和wi(0 < zi < 1000, 0 <= wi <= 100), 表示每台机器的最大工作时间和机器等级。
接下来的m行,每行两个整数xi和yi(0 < xi < 1000, 0 <= yi<= 100), 表示每个任务需要的完成时间和任务的难度等级。

输出描述:

输出两个整数, 分别表示最大能完成的任务数量和获取的收益。

示例1

输入

1 2
100 3
100 2
100 1

输出

1 20006

先对机器和任务按照时间从大到小排序,我们要做的是维护一张技术难度等级表,该等级表的下标是机器的技术难度等级,值是具有该机器难度等级的机器的数量:考察每一个任务,该登记表记录了机器时间大于当前任务时间的所有情况,并且按机器难度等级作为下标登记入表,然后该任务以自己的难度作为下标查找该表,如果能直接找到相同难度等级的机器,就直接使用该机器,计算收益,跳出,继续考察下一个任务,继续更新技术难度等级表;如果不能找到,则选择最小的大于当前任务技术难度的机器。

#include<iostream>
#include<vector>
#include<sstream>
#include<algorithm>
#include <map>
using namespace std;

class node{
public:
    int x;
    int y;
    node(int a,int b):x(a),y(b){}
};
int main()
{
    int n,m;
    cin>>n>>m;
    vector<node> machine;
    vector<node> task;
    int input1,input2;
    int i=0,j=0;
    while(i<n&&cin>>input1)
    {
        cin>>input2;
        machine.emplace_back(input1,input2);
        i++;
    }
    while(j<m&&cin>>input1)
    {
        cin>>input2;
        task.emplace_back(input1,input2);
        j++;
    }
    sort(machine.begin(),machine.end(),[](node a,node b){return a.x>b.x;});
    sort(task.begin(),task.end(),[](node a,node b){return a.x>b.x;});
    for(auto& m:machine)
        cout<<"m.x="<<m.x<<" m.y="<<m.y<<endl;
    for(auto& t:task)
        cout<<"t.x="<<t.x<<" t.y="<<t.y<<endl;
    vector<int> state(100, 0);
    i=0;j=0;
    int cnt=0;
    int ans=0;
    for(;j<m;j++)
    {
        while(i<n&&machine[i].x>=task[j].x)
        {
            state[machine[i].y]++;
            i++;
        }
        for(int k=task[j].y;k<100;k++)
        {
            if(state[k])
            {
               cnt++;
               state[k]--;
               ans=ans+200*task[j].x+3*task[j].y;
               break;
            }
        }
    }
    cout<<cnt<<" "<<ans<<endl;
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值