腾讯笔试题——安排机器

安排机器

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;
}

发布了58 篇原创文章 · 获赞 43 · 访问量 4385

猜你喜欢

转载自blog.csdn.net/Wz_still_shuai/article/details/102014216