腾讯笔试题:安排机器详细解析

        小Q的公司最近接到m个任务, 第i个任务需要xi的时间去完成,难度等级为yi。小Q拥有n台机器, 每台机器最长工作时间zi,机器等级wi。

        对于一个任务,它只能交由一台机器来完成,如果安排给它的机器的最长工作时间小于任务需要的时间,则不能完成,如果完成这个任务将获得200 * xi + 3 * yi收益。对于一台机器,它一天只能完成一个任务, 如果它的机器等级小于安排给它的任务难度等级,则不能完成。

        小Q想在今天尽可能的去完成任务,即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。

腾讯笔试题:安排机器详细解析_第1张图片

看代码前先来了解一下几个知识:

1、头文件

程序员们梦寐以求的头文件

#include包含了C++的所有头文件!

2、命名空间

C++之using namespace std 详解与命名空间的使用

C++引入名字空间(namespace)意义何在?为什么using namespace std会成为常用语句?

没有躲过的坑--使用using namespace std的坏习惯

3、const

关于C++ const 的全面总结

4、结构体

C语言中的结构体(struct)

5、C++sort()函数

C++sort函数的用法

6、C++memset()函数

C++中memset的用法

C函数之memset()函数用法

C++中memset函数的用法

        解析:按照时间和等级降序,这样保证取到的一定是收益最大的解(因为时间的收益严格大于等级,所以时间作为第一关键字,如果能完成收益大的任务,自然不会去完成收益低的任务);然后在此基础上,把所有工作时间大于等于任务的机器加入一个等级数组中,取出等级最接近任务等级的,且大于等于任务等级的,就是下限,这样可以保证完成的任务一定是最多的,不会遗漏。(因为任务和机器都按照时间进行过排序,那么在等级数组中机器的时间一定是可以完成后续任务的,它们是被时间更长的任务选择进来的,所以在此不需要考虑机器的工作时间了,在后面他们的时间不会有区别都是一样的,为了防止后面出现等级更大的任务,那么肯定要选择等级刚好大于任务的机器了),这样两次贪心下来得到的就是一定是最优解了,而且第二次贪心可以二分,不会超时。

接下来看笔试题的C语言代码

腾讯笔试题:安排机器详细解析_第2张图片
腾讯笔试题:安排机器详细解析_第3张图片

看java代码:(解析请参考C代码的注释,思想一模一样)

先了解一下有关java的知识:

内部类及静态内部类的实例化

【java】Comparator的用法

Java 解惑:Comparable 和 Comparator 的区别

腾讯笔试题:安排机器详细解析_第4张图片
腾讯笔试题:安排机器详细解析_第5张图片
腾讯笔试题:安排机器详细解析_第6张图片

运行结果:

腾讯笔试题:安排机器详细解析_第7张图片

你可能感兴趣的:(腾讯笔试题:安排机器详细解析)