HDU 4864 Task

题意: 每台机器有x,y两种属性,有m个任务。假设机器的这两个属性大于任务,那么就是能够完毕这个任务,而且每一个任务每仅仅能完毕一个任务。
思路:先依照x排序,x相等,依照y排序,每一次记录下来能够完毕这个任务的机器。寻找属性相差最小的那台。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define N 111111

struct node{
    int x,y;
    ll ac;
    void input(){
     scanf("%d%d",&x,&y);
     ac = 500*x+2*y;
    }
}a[N],b[N];


bool cmp(node xx,node yy){
   if(xx.x==yy.x) return xx.y>yy.y;
   return xx.x>yy.x;
}

int n,m;
int vis[111];

int main(){
    while(scanf("%d%d",&n,&m)==2){
        for(int i=0;i<n;i++)
            a[i].input();
        for(int j=0;j<m;j++)
            b[j].input();
        sort(a,a+n,cmp);
        sort(b,b+m,cmp);
        ll sum = 0;
        int ans =0;
        memset(vis,0,sizeof(vis));
        for(int i=0,j=0;i<m;i++){
            while(j<n&&a[j].x>=b[i].x){
                vis[a[j].y]++;
                j++;
            }
            for(int k=b[i].y;k<=100;k++){
                if(vis[k]){
                vis[k]--;
                ans++;
                sum+=b[i].ac;
                break;
                }
            }
        }
        printf("%d %I64d\n",ans,sum);

    }
}
posted @ 2017-08-07 08:01  yfceshi  阅读(125)  评论(0编辑  收藏  举报