这题是个贪心题,然后任务得到的赏金是500a+2b,从这两个系数可以看出来,a(运行时间)在赏金里占的比重大,那么贪心的策略先将任务和机器按照第一关键字从小到大排序(也就是运行时间),然后二分图求最大匹配的问题了,如何在最大匹配的时候得到最高的赏金?那么我们就要从运行时间大到小枚举任务,然后将满足大于等于该任务时间的所有机器放进去,用一个multiset来维护机器的等级,当然最好别用set,因为set不能处理相同值的元素,最后我们要通过二分来找出满足大于等于该任务等级的最小机器等级值,如果找的到就把这个元素删去,答案加上500a’+2b’。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#define x first
#define y second
using namespace std;
const int N=100010;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
pii mch[N];
pii task[N];
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>mch[i].x>>mch[i].y;
for(int i=0;i<m;i++)
cin>>task[i].x>>task[i].y;
sort(mch,mch+n);
sort(task,task+m);
multiset<int>s;
ll res=0;
int cnt=0;
for(int i=m-1,j=n-1;i>=0;i--)
{
int a=task[i].x,b=task[i].y;
while(j>=0&&a<=mch[j].first) s.insert(mch[j--].second);
auto it=s.lower_bound(b);
if(it!=s.end())
{
cnt++;
res+=a*500+b*2;
s.erase(it);
}
}
cout<<cnt<<' ';
cout<<res<<endl;
}
return 0;
}
这是Y总课程原话和原代码吧
应该是hh