题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864
一开始脑子热,没做出来,参考大神解题报告得解。http://blog.csdn.net/a601025382s/article/details/38046927
我觉得核心是查找条件满足,等级最低的情况时,不需要具体知道是哪个机器做了该项任务,只需要通过等级,将比xi大的机器全部累加起来,用的时候在数量上减一即可,就是程序中c[]的作用。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int i,j,num,k,n,m,c[101];
__int64 ans;
bool f[100001];
struct node
{
int t,l;
}a[100001],b[100001];
bool cmp(node A,node B)
{
if (A.t<B.t) return 0;
if (A.t>B.t) return 1;
if (A.l>B.l) return 1;
return 0;
}
int main()
{
while (scanf("%d%d",&n,&m)==2)
{
memset(c,0,sizeof(c));
ans=0;
num=0;
for (i=1;i<=n;i++)
scanf("%d%d",&a[i].t,&a[i].l);
for (i=1;i<=m;i++)
scanf("%d%d",&b[i].t,&b[i].l);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+m,cmp);
for (i=1,j=1;i<=m;i++)
{
while (j<=n&&b[i].t<=a[j].t)
{
c[a[j].l]++;
j++;
}
for (k=b[i].l;k<=100;k++)
if (c[k]>0)
{
c[k]--;
ans+=500*b[i].t+2*b[i].l;
num++;
break;
}
}
printf("%d %I64d\n",num,ans);
}
return 0;
}