这题目很不错,根据题目所给的数据范围,得到最优解由时间得到;
将机器和任务放在一个数组内,按时间,等级,机器还是任务的优先级次序排序,遍历数组,选择能完成该任务,且与任务等级相差最近的机器(时间已经排序,所以不考虑)。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<time.h>
#include<math.h>
#define inf 0x7ffffff
#define eps 1e-9
#define pi acos(-1.0)
#define N 200000+5
#define ll __int64
#define P system("pause")
using namespace std;
struct node
{
int x,y,flag;
}a[N];
int ma[105];
bool cmp(node a,node b)
{
if(a.x != b.x) return a.x > b.x;
if(a.y != b.y) return a.y > b.y;
return a.flag > b.flag;
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
int i;
memset(ma,0,sizeof(ma));
for(i = 0; i < n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].flag = 1;
}
for(; i < n+m; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].flag = 0;
}
ll ans = 0;
int k = 0;
sort(a,a+n+m,cmp);
// for(i = 0; i < m+n; i++)
// cout<<a[i].x<<" "<<a[i].y<<endl;
for(i = 0; i < n+m; i++)
{
if(a[i].flag == 1){//将机器的等级记录下来
ma[a[i].y]++;
// cout<<a[i].y<<endl;
}
else{
for(int j = a[i].y; j <= 100; j++)
if(ma[j])
{
ma[j]--;
ans += (ll)(500*a[i].x+2*a[i].y);
k++;
break;
}
}
}
printf("%d %I64d\n",k,ans);
}
return 0;
}