#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 100010
struct LNode{
int x,y;
}f1[N],f2[N];
bool cmp(LNode a,LNode b){ //这里排序也容易出错!
//return a.y > b.y; //从大到小排序
if(a.x==b.x) return a.y>b.y;
else return a.x>b.x;
}
int main(){
freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=0;i<N;i++){
f1[i].x = f1[i].y = f2[i].x = f2[i].y = 0;
}
for(int i=0;i<n;i++){
scanf("%d %d",&f1[i].x,&f1[i].y);
}
for(int i=0;i<m;i++){
scanf("%d %d",&f2[i].x,&f2[i].y);
}
// for(int i=0;i<101;i++){
// c[i].x=c[i].y=0; //初始化c数组
// }
sort(f1,f1+n,cmp);
sort(f2,f2+m,cmp); //从大到小排序
//i代表当前为第几个任务 //m代表任务数量,数组f2
__int64 num=0,t=0;
int c[101]={0};
memset(c,0,sizeof(c));
for(int i=0,j=0;i<m;i++){
while(f1[j].x>=f2[i].x ){
c[f1[j].y]++; //当前机器的等级 +1
j++;
}
for(int k=f2[i].y;k<101;k++){ //注意k的初始化,k应该从f2[i].y开始!
if(c[k]){
num = num + f2[i].x*500+f2[i].y*2;
t++;c[k]--;
//printf("%d %d\n",k,num);
break;
}
}
}
printf("%I64d %I64d\n",t,num);
}
return 0;
}
/*
*总结:(贪心)
*1.数组开小了
*2.while循环中的j<n也需要加上去! 否则需要在每次的输入前初始化f1,f2数组!
*3.内部第二重for循环k的初始化错误! 需要保证找到的机器的y值大于当前任务的y值!
*/
Hdu-4864-Task
最新推荐文章于 2021-02-15 16:13:55 发布