腾讯笔试——安排机器 【 题目描述】小 Q 的公司最近接到 m 个任务, 第 i 个任务需要 xi 的时间去完成, 难度等级为 yi。 小 Q 拥有 n 台机器, 每台机器最长工作时间 zi, 机器等

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36391130/article/details/82145592

安排机器
【 题目描述】小 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

思路:首先,我们将这些数据存储在数组里,然后进行降序排序,为什么要进行排序呢?为了避免之后选择时复杂的判断,或者出现田忌赛马这样的事情;当对其进行排序之后,一切都变得简单了,我们只需要顺序的为每一个机器选择效益最大的那个任务,而且这时候,我们能够肯定, 当前任务之后,再没有比它更好的选择了(对其进行降序排序的好处,当然,我们对其等级先降序排序,再对其耗费时间进行降序排序)。代码如下:

void tengxun_anpaijiqi()
{
    typedef struct T_L
    {
        int time;
        int rank;
        bool is_sure;
    }T_L;
    class mygreator_t  //时间比较仿函数
    {
    public:
        bool operator()(T_L left,T_L right)
        {
            return (left.time > right.time);
        }
    };
    class mygreator_r    //等级比较仿函数
    {
    public:
        bool operator()(T_L left, T_L right)
        {
            return (left.rank > right.rank);
        }
    };
    int n= 0, m = 0;
    scanf("%d%d", &n, &m);   //输入机器数量和任务数量
    vector<T_L> machine(n);
    vector<T_L> task(m);
    for (int i = 0; i < n; i++)  //机器
    {
        scanf("%d %d",&machine[i].time,&machine[i].rank);
    }
    for (int i = 0; i < m; i++)  //任务
    {
        scanf("%d %d", &task[i].time, &task[i].rank);
    }
    sort(machine.begin(), machine.end(), mygreator_r());
    sort(task.begin(), task.end(), mygreator_r());
    sort(machine.begin(), machine.end(), mygreator_t());
    sort(task.begin(), task.end(), mygreator_t());
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (machine[i].time>=task[j].time&&machine[i].rank>=task[j].rank&&task[j].is_sure == false&&machine[i].is_sure==false)
            {

                machine[i].is_sure = true;
                task[j].is_sure = true;
                break;
            }
        }
    }
    int result = 0;
    int count = 0;
    for (int k = 0; k < m; k++)
    {
        if (task[k].is_sure)
        {
            count++;
            result += (200 * task[k].time + 3 * task[k].rank);
        }
    }
    printf("%d %d\n", count,result);
}

猜你喜欢

转载自blog.csdn.net/qq_36391130/article/details/82145592
今日推荐