騰訊機試-安排機器

鏈接: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
  1. 對於一個任務,它只能交由一臺機器來完成, 如果安排給它的機器的最長工作時間小於任務需要的時間, 則不能完成,如果完成這個任務將獲得200 * xi + 3 * yi收益。  
  2. 對於一臺機器,它一天只能完成一個任務, 如果它的機器等級小於安排給它的任務難度等級, 則不能完成。
  3. 小Q想在今天儘可能的去完成任務, 即完成的任務數量最大。
  4. 如果有多種安排方案,小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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章