hdu 4864 Task (贪心 技巧)

题目链接

一道很有技巧的贪心题目。

题意:有n个机器,m个任务。每个机器至多能完成一个任务。对于每个机器,有一个最大运行时间xi和等级yi,

对于每个任务,也有一个运行时间xj和等级yj。只有当xi>=xj且yi>=yj的时候,机器i才能完成任务j,并获得

500*xj+2*yj金钱。问最多能完成几个任务,当出现多种情况时,输出获得金钱最多的情况。

分析:机器和任务都按照先拍x从大到小,再拍y从大到小的顺序。然后遍历任务,注意f[]数组的作用,f[]数组标

记大于当前任务时间的机器的等级个数, 由于任务都是从大到小排序了,所以接下来时间已经不是影响了,因为

已经遍历过的机器的时间都是大于 将要遍历的机器的时间的。所以只需要从 这些符合时间条件的机器里选择一个

等级最小的,以免因为等级影响后面的遍历。 为什么要按照先x排序呢,因为500 > 2*100; 为什么按照y从大到

小,因为x相等的情况下,y越大,计算的值越大。

最后注意hdu的int64;

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <algorithm>
 8 #define LL long long
 9 using namespace std;
10 const int maxn = 100000+10;
11 int n, m, f[110];
12 struct node
13 {
14     int x, y;
15 } ma[maxn], ta[maxn];
16
17 bool cmp(node a, node b)
18 {
19     if(a.x==b.x)
20         return a.y > b.y;
21     return a.x > b.x;
22 }
23 int main()
24 {
25     int i, j, k, cnt;
26     __int64 ans;
27     while(~scanf("%d%d", &n, &m))
28     {
29         ans = 0;  cnt = 0;
30         memset(f, 0, sizeof(f));
31         for(i = 0; i < n; i++)
32             scanf("%d%d", &ma[i].x, &ma[i].y);
33         for(i = 0; i < m; i++)
34             scanf("%d%d", &ta[i].x, &ta[i].y);
35         sort(ma, ma+n, cmp);
36         sort(ta, ta+m, cmp);
37         j = 0;
38         for(i = 0; i < m; i++)
39         {
40             while(j < n)
41             {
42                 if(ma[j].x >= ta[i].x)
43                 f[ma[j].y] ++;
44                 else break;
45                 j ++;
46             }
47             for(k = ta[i].y; k <= 100; k++)
48             {
49                 if(f[k])
50                 {
51                     f[k] --;
52                     ans += 500*ta[i].x + 2*ta[i].y;
53                     cnt ++;
54                     break;
55                 }
56             }
57         }
58         printf("%d %I64d\n", cnt, ans);
59     }
60     return 0;
61 }

hdu 4864 Task (贪心 技巧)

时间: 2024-10-08 01:18:17

hdu 4864 Task (贪心 技巧)的相关文章

HDU 4864 Task(贪心)

HDU 4864 Task 题目链接 题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多 思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200.然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

HDU 4864 Task (贪心+STL多集(二分)+邻接表存储)(杭电多校训练赛第一场1004)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864 解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值, 一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在

HDU 4864 Task 贪心 好题

Task Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4103    Accepted Submission(s): 1077 Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete.

HDU 4864 Task(2014多校--贪心)

Task 比赛当时思路想的差不多,感觉能过的,该处理的也都处理到了,最后还是没过,可能是二分写错了吧-.- 大意:给你n个机器,m个要完成的任务,每个机器跟任务都有两个属性,机器是最大工作时间跟等级,任务是需要工作的时间跟等级.完成一个任务可以得到500*(工作时间)+2*(等级)的报酬.完成任务的条件是机器的工作时间满足任务的需要,等级要大于等于任务的等级,一个机器只能用一次,一个任务也只能用一个机器去完成.需要进行策略选择,使得完成更多的任务. 思路:开始想的就是贪心,也想到了贪心的时候时间

hdu 4864 Task (贪心)

# include <stdio.h> # include <algorithm> # include <string.h> using namespace std; struct node { int t; int v; int yy; }; struct node a[100010],b[100010]; bool cmp(node a1,node a2) { if(a1.t==a2.t)//先按时间从大到小 return a1.v>a2.v;//再按水平从大

HDU 4864 Task(基本算法-贪心)

Task Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company

hdu 4869 Task(贪心)

题目链接:hdu 4869 Task 题目大意:有n台机器,m个任务,每个机器和任务都有有xi和yi,要求机器的xi,yi均大于等于任务的xi和yi才能执行任务.每台机器一天只能执行一个任务.要求完成的任务数尽量多,并且说金额尽量大.完成每个任务的金额为xi?500+yi?2 解题思路:贪心,mach[i][j]表示等级为i,时间为j的机器数量,task[i][j]表示等级为i,时间为j的机器数量.每次优先减少i,因为对应等级减少100,对应的金额代价也不会减少超过500(即时间减少1). 每次

hdu 4864 Task(贪婪啊)

主题链接:pid=4864">http://acm.hdu.edu.cn/showproblem.php?pid=4864 Task Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1346    Accepted Submission(s): 336 Problem Description Today the company h