题目描述
2018腾讯后台实习生笔试第三个编程题与这个基本一样。区别在于收益公式。
有N个机器和m个工作,机器和工作都有一个时间xi和价值yi,一个工作只有满足xi和yi都小于机器的才能在这个机器上做,一个机器最多能做一个工作,做一个工作获得的钱是工作的xi*500+yi*2,最多完成多少任务,最多有多个的话输出钱最多的。怎样安排?
思路
- 先排序task 和machine,方法是先按照Xi排序,Xi相同按照Yi
- 然后遍历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;
}
其他注意事项
- 收益Q为long long类型;
- 注意N和M输入用while循环,持续输入,被oj坑了,第一次做oj,一直以为code哪里不对;