hoj 4864: task 贪心算法

题目描述

2018腾讯后台实习生笔试第三个编程题与这个基本一样。区别在于收益公式。
有N个机器和m个工作,机器和工作都有一个时间xi和价值yi,一个工作只有满足xi和yi都小于机器的才能在这个机器上做,一个机器最多能做一个工作,做一个工作获得的钱是工作的xi*500+yi*2,最多完成多少任务,最多有多个的话输出钱最多的。怎样安排?

思路

  1. 先排序task 和machine,方法是先按照Xi排序,Xi相同按照Yi
  2. 然后遍历task去找一个满足条件Yi最小的machine,用一个数组标记machine是否被使用,下标是Yi.

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b)
{
    if(a.first!=b.first)
        return a.first>b.first;
    return a.second>b.second;
}
int main()
{

    int N,M;
    while(cin>>N>>M)
    {
        int i=0;
        pair<int,int> task[100005];
        pair<int,int> machine[100005];
        //int machineFlag[105]={0};
        int machineFlag[105];
        memset(machineFlag,0,sizeof(machineFlag));
        while(i<N)
        {
            cin>>machine[i].first>>machine[i].second;
            i++;
        }
        i=0;
        while(i<M)
        {
            cin>>task[i].first>>task[i].second;
            i++;
        }
        sort(task,task+M,cmp);
        sort(machine,machine+N,cmp);
        int j=0;
        int taskdonecount=0;
        long long Q=0;
        for(i=0; i<M; i++)
        {
            while(j<N&&task[i].first<=machine[j].first)//统计满足条件的机器,注意j是一直增大的,相当于扫描一次机器表
            {
                machineFlag[machine[j].second]++;
                j++;
            }
            for(int k=task[i].second; k<=100; k++) // 找到满足条件的难度最小的机器
            {
                if(machineFlag[k]) //
                {
                    machineFlag[k]--;
                    taskdonecount++;
                    Q+=(500*task[i].first+2*task[i].second);
                    break; // 注意这里直接找到合适机器,结束查找机器。
                }
            }

        }
        cout<<taskdonecount<<" "<<Q<<endl;
    }
    return 0;
}

其他注意事项

  1. 收益Q为long long类型;
  2. 注意N和M输入用while循环,持续输入,被oj坑了,第一次做oj,一直以为code哪里不对;

参考

https://blog.csdn.net/a601025382s/article/details/38046927

猜你喜欢

转载自blog.csdn.net/ytang_/article/details/79939487
今日推荐