自爆魂

博客园 首页 新随笔 联系 订阅 管理

http://acm.hdu.edu.cn/showproblem.php?pid=4864

有n台机器,m个任务,每台机器有xi时间,yi等级,每个任务也有xj,yj,当一个任务可以被处理的条件是,xj<=xi 且 yj<yi,处理完产生 500*xj+2*yj 的价值,问你最多产生的价值是多少?


对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200。然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级上尽量小就可以了

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define clr0(x) memset(x,0,sizeof(x))

#define x first
#define y second
typedef __int64 LL;
int a[1500][105],b[1500][150],t,f;
LL g;
int main()
{
    int m,n,x,y;
    while(~RD2(n,m)){
        clr0(a),clr0(b);
        for(int i = 0;i < n;++i){
            RD2(x,y);a[x][y]++;
        }
        for(int i = 0;i < m;++i){
            RD2(x,y);b[x][y]++;
        }
        g = t = 0;
        for(int i = 1440;i >= 0;i--){
            int f = 0;
            for(int j = 101;j >= 0;--j){
                f += a[i][j];
                if(f >= b[i][j]){
                    f -= b[i][j];
                    t += b[i][j];
                    g += (LL)b[i][j]*(LL)(500*i+2*j);
                    for(int k = j;k <= 101;++k){
                        if(a[i][k] >= b[i][j]){
                            a[i][k] -= b[i][j];
                            break;
                        }
                        else{
                            b[i][j] -= a[i][k];
                            a[i][k] = 0;
                        }
                    }
                }else{
                    t += f;
                    g += (LL)f*(LL)(500*i+2*j);
                    for(int k = j;k <= 101;++k){
                        if(a[i][k] >= f){
                            a[i][k] -= f;
                            break;
                        }
                        else{
                            f -= a[i][k];
                            a[i][k] = 0;
                        }
                    }
                    f = 0;
                }
            }
            if(i){
                for(int j = 101;j >= 0;--j)
                    a[i-1][j] += a[i][j];
            }
        }
        printf("%d %I64d\n",t,g);
    }
    return 0;
}


posted on 2014-10-22 00:38  自爆魂  阅读(191)  评论(0编辑  收藏  举报