鏈接:https://www.nowcoder.com/questionTerminal/42e7ff5c5696445ab907caff17fc9e15
來源:牛客網
小Q的公司最近接到m個任務, 第i個任務需要xi的時間去完成, 難度等級爲yi。
小Q擁有n臺機器, 每臺機器最長工作時間zi, 機器等級wi。
任務 | 時間 | 難度 | 機器 | 最長工作時間 | 及其等級 | |
1 | x1 | y1 | 1 | z1 | w1 | |
2 | x2 | y1 | 2 | z2 | w2 | |
... | ... | ... | .... | ... | ... | |
m | xm | ym | n | zn | wn |
- 對於一個任務,它只能交由一臺機器來完成, 如果安排給它的機器的最長工作時間小於任務需要的時間, 則不能完成,如果完成這個任務將獲得200 * xi + 3 * yi收益。
- 對於一臺機器,它一天只能完成一個任務, 如果它的機器等級小於安排給它的任務難度等級, 則不能完成。
- 小Q想在今天儘可能的去完成任務, 即完成的任務數量最大。
- 如果有多種安排方案,小Q還想找到收益最大的那個方案。
輸入描述:
輸入包括N + M + 1行,
輸入的第一行爲兩個正整數n和m(1 <= n, m <= 100000), 表示機器的數量和任務的數量。
接下來n行,每行兩個整數zi和wi(0 < zi < 1000, 0 <= wi <= 100), 表示每臺機器的最大工作時間和機器等級。
接下來的m行,每行兩個整數xi和yi(0 < xi < 1000, 0 <= yi<= 100), 表示每個任務需要的完成時間和任務的難度等級。
輸出描述:
輸出兩個整數, 分別表示最大能完成的任務數量和獲取的收益。
示例1:輸入
1 2
100 3
100 2
100 1
輸出:
1 20006
牛客出的: 《名企校招筆試真題精選2019》給出的程序,但是沒有講解,我把裏面的變量名稱換了換
此時,深刻感受到變量命名是多麼重要:
解決方案:
1、對機器和任務都分別進行排序:時間從大到小,時間相同的按照等級由大到小(cmp完成)
2、對每一個任務進行循環:(第一個 for 循環)
第一個 while 找到 時間上能夠處理當前任務的機器(先忽略等級要求),然後將 cnt 中對應等級位置加一操作
第二個 for 循環,看對應等級上,有沒有機器可以處理相應的任務,while循環已經保證了時間上的可操作性
//安排機器
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 1e5 + 10;
struct node{
int time,grade;
}machine[maxn],task[maxn];
int cnt[105];
int cmp(node a,node b){
if(a.time==b.time){
return a.grade>b.grade;
}
return a.time>b.time;
}
int main(){
int numMachine,numTask;
scanf("%d%d",&numMachine,&numTask);
for(int i=0;i<numMachine;i++){
scanf("%d%d",&machine[i].time,&machine[i].grade);
}
for(int i=0;i<numTask;i++){
scanf("%d%d",&task[i].time,&task[i].grade);
}
sort(machine,machine+numMachine,cmp);
sort(task,task+numTask,cmp);
// for(int i=0;i<numMachine;i++){
// printf("%d %d\n",e[i].time,e[i].grade);
// }
// for(int i=0;i<numTask;i++){
// printf("%d %d\n",f[i].time,f[i].grade);
// }
int num = 0;
LL ans = 0;
memset(cnt,0,sizeof(cnt));
int i,j,k;
for(i=0,j=0;i<numTask;i++){ //對於每個任務而言
while(j<numMachine && machine[j].time>=task[i].time){
cnt[machine[j].grade]++;
j++;
}
for(k=task[i].grade;k<=100;k++){
if(cnt[k]){
num++;
cnt[k]--;
ans = ans+200*task[i].time + 3*task[i].grade;
break;
}
}
}
printf("%d %lld\n",num,ans);
return 0;
}