zoukankan      html  css  js  c++  java
  • hdu 4864 任务分配贪心

    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
    ",t,g);
        }
        return 0;
    }


  • 相关阅读:
    搭建个人Spring-Initializr服务器
    “不蒜子”统计总访问人数脚本
    基于Hazelcast及Kafka实现的分布式锁与集群负载均衡
    虚拟机部署hadoop集群
    程序员、黑客及开发者之间的区别
    今日校园自动登录教程
    逆向DES算法
    来自穷逼对HttpCanary的蹂躏
    今日校园提交签到和查寝-Java实现
    JS 判断数据类型方法
  • 原文地址:https://www.cnblogs.com/zibaohun/p/4046761.html
Copyright © 2011-2022 走看看