一、题目地址
二、题目分析
题目分别给了任务和机器的两种属性x,y,为达到最大任务完成数,可以将任务的所需时间xi按降序排列,即优先考虑时间长的任务,时间相同的按级别yi递减排序。在进行处理时,循环遍历每个任务,找出满足其时间需要的集合,并记录对应级别y出现的次数,然后从当前任务对应的级别开始遍历,题中最大级别100,从时间上满足的集合中选出级别最小满足的机器,这样在该集合中可以留下较大级别的机器,便于下个任务使用。
三、AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=100005;
struct node{
int x,y;
}a[maxn],b[maxn];
bool cmp(const node& a,const node& b){
if(a.x==b.x)return a.y>b.y;
return a.x>b.x;
}
int s[150];
int main(){
int n,m;
while(cin>>n>>m){
memset(s,0,sizeof(s));
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y;
}
for(int i=0;i<m;i++){
cin>>b[i].x>>b[i].y;
}
sort(a,a+n,cmp);
sort(b,b+m,cmp);
int j=0;
long long money=0;
int num=0;
for(int i=0;i<m;i++){
while(j<n&&b[i].x<=a[j].x){
s[a[j].y]++;//统计满足时间要求的机器的等级及其等级对应个数
j++;
}
for(int k=b[i].y;k<=100;k++){//从当前任务的等级遍历到100
if(s[k]>0){//找到满足机器时间并且等级最小满足的任务 ,>0表示存在
num++;
money+=500*b[i].x+2*b[i].y;
s[k]--;//用掉一个机器
break;
}
}
}
cout<<num<<" "<<money<<endl;
}
}