题意 给你n个工作时间和等级的机器 给你m个有工作时间和等级的任务
每个机器只能解决一个任务然后等级和时间必须同时大于等于任务问能满足的最多数目
这个贪心不难想到把时间和等级都从大到小排 以时间为第一优先度
然后我们知道 如果一个任务时间比你高 我们给等级打上标记 每次找到一个最小满足的 贪前面尽量凑齐 然后最小满足因为再大点肯定可以满足 然后我们就可以把等级数量减减 这样的复杂度不再是n*m 而是 n*等级数量
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <cmath>
#include <map>
#include <stack>
using namespace std;
const int MAX_N = 100024;
struct node {
int tm,lv;
bool operator < (const node &other ) const
{
if(tm == other.tm) return lv > other.lv;
return tm > other.tm;
}
}arr[MAX_N],arr_[MAX_N];
int s[124];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
memset(s,0,sizeof(s));
int res = 0;
long long ans = 0;
for(int i = 1;i<=n;++i)
scanf("%d%d",&arr[i].tm,&arr[i].lv);
for(int i = 1;i<=m;++i)
scanf("%d%d",&arr_[i].tm,&arr_[i].lv);
sort(arr+1,arr+1+n);
sort(arr_+1,arr_+1+m);
int j = 1;
for(int i = 1;i<=m;++i){
while(j<=n&&arr[j].tm>=arr_[i].tm){
s[arr[j].lv]++;
j++;
}
for(int k = arr_[i].lv;k<=100;k++){
if(s[k]){
res++;
s[k]--;
ans+=(1ll*500*arr_[i].tm+2ll*arr_[i].lv);
break;
}
}
}
printf("%d %lld\n",res,ans);
}
return 0;
}