騰訊筆試題——安排機器

安排機器

1.問題描述

小 Q 的公司最近接到 m 個任務, 第 i 個任務需要 xi 的時間去完成, 難度等級爲 yi。
小 Q 擁有 n 臺機器, 每臺機器最長工作時間 zi, 機器等級 wi。
對於一個任務,它只能交由一臺機器來完成, 如果安排給它的機器的最長工作時間小於任務需要的時間,
則不能完成,如果完成這個任務將獲得 200 * xi + 3 * yi 收益。
對於一臺機器,它一天只能完成一個任務, 如果它的機器等級小於安排給它的任務難度等級, 則不能完成。
小 Q 想在今天儘可能的去完成任務, 即完成的任務數量最大。如果有多種安排方案,小 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 2
100 3
100 2
100 1
輸出示例:
1 20006

2.思路:貪心算法

(1)將機器與任務都按照時間優先的原則來進行降序排列

(2)此時,將記錄下能夠處理同等級任務的機器數目

(3)在同等級任務中找到能完成任務的等級最低的機器即可

3.代碼:

//騰訊筆試題:安排機器
//問題描述:現在有一批任務與一批機器,每個任務對應的處理時間是x,任務等級是r
//	同樣機器也有最大處理時間與機器等級;
//	現規定,能處理摸個任務的機器必須滿足以下條件:
//		1.機器的最大處理時間 >= 任務時間
//		2.機器的等級 >= 任務等級
//	收益 = 200 * x + 3 * r
//	輸入:任務的數目,每個任務的時間與等級
//		 機器的數目,機器的時間與等級
//	要求:結果輸出最大處理數目以及收益



//思路:貪心算法
//	對機器與任務按照時間優先原則進行排序
//	遍歷已經排好序的機器與任務,從中選擇能完成當前任務的等級最低的機器即可

#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
typedef struct node {
	int time;
	int rate;
}node;

#define max 100

int cmp(node left, node right) {
	if (left.time == right.time) {
		return left.rate > right.rate ? left.rate : right.rate;
	}
	return left.time > right.time ? left.time : right.time;
}

void solu() {
	node machine[max];
	node task[max];
	int m_num, t_num;
	scanf("%d %d", &m_num, &t_num);
	for (int i = 0; i < m_num; ++m_num) {
		scanf("%d %d", &machine->time, &machine->rate);
	}
	for (int i = 0; i < t_num; ++t_num) {
		scanf("%d %d", &task->time, &task->rate);
	}
	//將機器和任務都按照時間優先的原則進行降序排列
	sort(machine, machine + m_num, cmp);
	sort(task, task + t_num, cmp);

	int num = 0;		//用來記錄所能處理的任務的數目;
	int pro = 0;		//用來記錄收益
	int j = 0;
	int arr[max] = { 0 };
	for (int i = 0,j = 0; i < t_num; ++i) {
		//將同一等級的機器都記錄下來
		while (j < m_num && machine[j].time >= task[i].time) {
			++arr[machine[j].rate];
			j++;
		}
        //找能夠處理該任務的最低等級的機器
		for (int k = task[i].rate; k < max; k++) {
			if (arr[k]) {
				num++;
				arr[k]--;
				pro += 200 * task[i].time + 3 * task[i].rate;
				break;
			}
		}
	}
	printf("%d\n%d\n", num, pro);
}

int main() {
	solu();
	system("pause");
	return 0;
}

 

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