【题解】安排机器

安排机器

http://www.nowcoder.com/questionTerminal/42e7ff5c5696445ab907caff17fc9e15

题面描述
小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

简要题意就是m个任务,每个任务有两个参数x,y
n个机器,每个机器有两个参数z,w
机器和任务匹配需要满足z>=x&&w>=y
一个任务只能和一个机器匹配,匹配上了以后将获得200 * x + 3 * y的奖励
需要完成的任务数量最大。如果有多种安排方案,需要找到收益最大的那个方案
关注数据范围,y和w是0到100的,x和z是0到1000的,而且1份x对于答案的贡献是200,一份y对于答案的贡献是3。
所以我们以x作为进行排序的第一优先级
将任务和机器都先使用x降序,x相等的时候使用y降序。
对每一个任务进行判断。有没有符合条件的机器。如果有的话,选择符合条件的y最接近的机器。

#include<iostream>
#include<algorithm>

using namespace std;

const int MAXN = 1e5+7;
struct node{
    int x,w;
};
bool cmp(node a ,node b)
{
    if(a.x==b.x)
    {
        return a.w>b.w;
    }
    return a.x>b.x;
}
int main()
{
    int n,m;
    cin>> n>> m;
    node T[MAXN],M[MAXN];

    for(int i = 0 ;i < n ; i++)
    {
        cin>>M[i].x>>M[i].w;
    }
    for(int i = 0 ;i < m ; i++)
    {
        cin>>T[i].x>>T[i].w;
    }
    sort(T,T+m,cmp);
    sort(M,M+n,cmp);
    int cnt[110]={0};
    int j = 0;
    long long ans = 0;
    int num = 0;
    for(int i = 0 ; i < m ; i++)
    {
        while(j<n && T[i].x<=M[j].x)
        {
            cnt[M[j].w]++;
            j++;
        }
        for(int k = T[i].w; k <= 100  ; k++)
        {
            if(cnt[k])
            {
                num++;
                cnt[k]--;
                ans += T[i].x*200+T[i].w*3;
                break;
            }
        }
    }
    cout<<num<<" "<<ans<<endl;
    return 0;
}
全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务