• hdu4864 Task贪心好题


    题目链接:

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

    题目大意:

    有n个机器,m个任务。每个机器至多能完成一个任务。对于每个机器,有一个最大运行时间xi和等级yi,对于每个任务,也有一个运行时间xj和等级yj。只有当xi>=xj且yi>=yj的时候,机器i才能完成任务j,并获得500*xj+2*yj金钱。问最多能完成几个任务,当出现多种情况时,输出获得金钱最多的情况。

    思路:

    由于x的权重远大于y的权重,因此我们将工作按照x降序排列, x相同的时候按照y降序排列, 这样就可以保证钱数最多。如果我们根据机器去选任务的话,会发现不好选,比如这个例子

    机器1:100 3 机器2:100 2

    任务1:75 2   任务2:65 3,如果机器从大到小,任务从大到小去选择,会出错,也不好控制得到最优解,任务从小到大也是这样。

    所以应该根据任务去选择机器,任务从大到小排列好,遍历的时候,每次先把所有时间大于该任务时间的机器按照等级存储下来,同等级的机器是等效的,因为只要能完成任务都是等效的,然后取其中恰好大于等于该任务等级的机器(这样可以保证等级高的留给之后的使用),之后选下一个也是这样,这样做的话,之前存储的机器由于时间大于第一个任务,所以时间上肯定可以满足之后的所有任务,等级的话也是取恰好大于等于自己任务的等级的机器

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long ll;
     8 const int maxn = 1e6 + 10;
     9 const int INF = 1 << 30;
    10 int T, n, m;
    11 struct node
    12 {
    13     int x, y;
    14     bool operator < (const node & a)const
    15     {
    16         return x > a.x || x == a.x && y > a.y;
    17     }
    18 };
    19 node a[maxn], b[maxn];
    20 int c[105];
    21 int main()
    22 {
    23     while(cin >> n >> m)
    24     {
    25         for(int i = 0; i < n; i++)cin >> a[i].x >> a[i].y;
    26         for(int i = 0; i < m; i++)cin >> b[i].x >> b[i].y;
    27         sort(a, a + n);
    28         sort(b, b + m);
    29         int j = 0;
    30         memset(c, 0, sizeof(c));
    31         ll sum = 0;
    32         int ans = 0;
    33         for(int i = 0; i < m; i++)//遍历任务
    34         {
    35             while(j < n && a[j].x >= b[i].x)//存储大于当前任务时长的机器,这些机器不仅可以当前使用,之后的任务也可以使用
    36             {
    37                 c[a[j].y]++;//c数组记录当前等级可用机器数目
    38                 j++;
    39             }
    40             for(int k = b[i].y; k < 101; k++)//等级从小到大,目的是取当前可用机器中等级最小
    41             {
    42                 if(c[k])//存在可用机器
    43                 {
    44                     c[k]--;//当前等级机器减一
    45                     sum += b[i].x * 500 + 2 * b[i].y;//任务完成利润增加
    46                     ans++;//任务完成数目+1
    47                     break;
    48                 }
    49             }
    50         }
    51         printf("%d %lld
    ", ans, sum);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    JQuery Ajax 的简单使用
    使用PHP QR Code生成二维码
    SQL中Group By的使用
    虚拟主机的配置
    文件上传
    session机制详解以及session的相关应用
    thinkphp权限管理Rbac实例
    jQuery处理点击父级checkbox所有子级checkbox都选中,取消选中所有子级checkbox都取消
    传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
    thinkphp3.2独立分组的建立
  • 原文地址:https://www.cnblogs.com/fzl194/p/8697692.html
Copyright © 2020-2023  润新知