HDOJ4864 Task 题解报告

Posted thwzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ4864 Task 题解报告相关的知识,希望对你有一定的参考价值。

题目传送门

【题目大意】

有$m$个任务,第$i$个任务等级为$y_i$,完成任务需要的时间为$x_i$,收益为$500*x_i+2*y_i$。有$n$台机器,第$i$台机器的等级为$y_i$,最长工作时间为$x_i$,如果任务等级高于机器等级或是任务时间大于机器工作时间,则不能用该机器完成该任务。一台机器只能完成一个任务,一个任务也只能在一台机器上完成,求最多可以完成多少个任务并求出最大收益。

【思路分析】

这题的贪心虽然很明显,但有点难想,因为时间在收益中所占的比重更大,所以考虑以时间为第一关键字,等级为第二关键字分别给任务和机器从大到小排序。然后枚举每个任务,记录每个满足时间条件的机器,再从小到大查找满足等级条件的机器并计算收益。

【代码实现】

技术图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define rg register
 6 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 7 #define ll long long
 8 using namespace std;
 9 const int N=100002;
10 int n,m,num[102],ans1;
11 ll ans2;
12 struct machine
13     int x,y;
14 a[N],b[N];
15 bool cmp(machine A,machine B)
16     if(A.x!=B.x) return A.x>B.x;
17     return A.y>B.y;
18 
19 int main()
20     while(scanf("%d%d",&n,&m)!=EOF)
21         go(i,1,n) scanf("%d%d",&a[i].x,&a[i].y);
22         go(i,1,m) scanf("%d%d",&b[i].x,&b[i].y);
23         sort(a+1,a+1+n,cmp);sort(b+1,b+1+m,cmp);
24         int j=1;
25         go(i,1,m)
26             while(j<=n&&a[j].x>=b[i].x) num[a[j].y]++,j++;
27             //记录满足时间条件的机器
28             go(k,b[i].y,100)
29                 if(num[k])//查找满足等级条件的机器
30                     num[k]--;ans1++;ans2+=500*b[i].x+2*b[i].y;
31                     break;
32                 
33         
34         printf("%d %lld\n",ans1,ans2);
35         ans1=ans2=0;memset(num,0,sizeof(num));
36     
37     return 0;
38 
代码戳这里

以上是关于HDOJ4864 Task 题解报告的主要内容,如果未能解决你的问题,请参考以下文章

题解报告:hdu 2057 A + B Again

题解报告:hdu 1848 Fibonacci again and again(尼姆博弈)

2019.11.11 题解报告

$CSP$ $2019$ $Day2$ 模拟考试 题解报告

$NOIP 2016 Day1$ 模拟考试 题解报告

$NOIP 2018 Day2$ 模拟考试 题解报告