洛谷 P10464 Task 题解
题目链接
挺不错的一道贪心题。首先观察数据范围,
于是我们将机器和任务都按
对于查找满足
对于查找满足
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100100,M=110;
int n,m,c[M],p,cnt;
ll ans;
struct node
{
ll x,y;
}a[N],b[N];
bool cmp(node a1,node a2)
{
if(a1.x!=a2.x) return a1.x>a2.x;
return a1.y>a2.y;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
for(int i=1;i<=m;i++) scanf("%lld%lld",&b[i].x,&b[i].y);
//从大到小排序
sort(a+1,a+n+1,cmp);
sort(b+1,b+m+1,cmp);
for(int i=1;i<=m;i++)//枚举任务
{
while(p<n&&a[p+1].x>=b[i].x)//维护指针,寻找新的可以满足x的机器
{
p++;
c[a[p].y]++;
}
for(int j=b[i].y;j<=100;j++)//在满足x的机器里,寻找满足y的
{
if(c[j])
{
cnt++;
c[j]--;//记得去掉
ans+=b[i].x*500+b[i].y*2;
break;//找到第一个就退出,因为要贪心地取y最小的
}
}
}
printf("%d %lld",cnt,ans);
return 0;
}