> 文章列表 > C++每日一练:任务分配问题(详解)

C++每日一练:任务分配问题(详解)

C++每日一练:任务分配问题(详解)

文章目录

  • 前言
  • 一、题目描述
  • 二、解题
    • 1.分析
    • 2.代码并注释
  • 总结

前言

今天这题比较有意思,排序算法还是比较有用的,显然选择排序在这里很容易实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目描述

题目描述:
小明手头上有n个问题,每个问题都有一个数值,表示这个问题的难度;正好小明团队有n个人,每个人都有一个数值,表示这个人的能力 现在小明要把这n个问题分配给每个人,要求能力更高的人分配到更高难度的问题

输入描述:
第1行包含一个数字 n (n <= 100000),表示小明手头上有n个问题,团队有n个人 第2行到第n+1行,每一行包含1个数字,表示n个问题的难度(正整数,小于10^9) 第n+2到2n+1行,每一行包含一个数字,表示团队n个人的能力值(正整数,小于10^9)

输出描述:
输出n行,按输入的顺序,输出每个人分配到的问题的难度,如果有两个人能力值相同,那么输入的顺序靠前,分配到更高难度的问题

示例:
输入
3
1
2
3
3
2
1

输出
3
2
1

二、解题

1.分析

选择排序的总体思路就是:每一次遍历选择一个最大或最小的元素,把它放到正确的位置上,所以选择排序的时间复杂度基本上是n^2。在本题中因为要同时遍历二个数组,时间复杂度会更高。
因不是按从小到大或从大到小排列。而是按能力值排序,所以需要稍做变通,新建一个数组,将每次循环得到的最大值(按题目要求)放到对应最大能力的位置。
又因输出要求string,最后转vector的时候需要转换一次。

2.代码并注释

代码如下:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>using namespace std;
vector<string> solution(int n, vector<int>& arr1, vector<int>& arr2){vector<string> result;// TODO://定义最大能力,最大工作,最大能力的index,最大工作的index,t是循环计数int max_ab=0, max_wo=0, max_ab_id=0, max_wo_id=0, t=0;int arr[n];    //新建一个组数用来存放排序结果while(t<n){for (int i=0; i<n; ++i){if (arr2[i]>max_ab){   //找出最大能力,及它的indexmax_ab = arr2[i];max_ab_id = i;}if (arr1[i]>max_wo){   //找出最大工作,及它的indexmax_wo = arr1[i];max_wo_id = i;}}arr2[max_ab_id] = 0;    //将最大能力置0arr1[max_wo_id] = 0;    //将最大工作置0arr[max_ab_id]=max_wo;   //在新数组里对应index中放入最大工作t++;max_ab=0, max_wo=0, max_ab_id=0, max_wo_id=0;   //初始值全置0}for (int i=0; i<n; ++i){   //将结果倒入resultstring tmp = to_string(arr[i]);result.push_back(tmp);}return result;
}

还是要吐槽一下,CSDN这个C++编译器… 太烂了!在VScode中可以这样写:

    int arr[3]={1,2,3};string arrs[3];for(int i=0; i<3; ++i){arrs[i]=to_string(arr[i]);}vector<string> v(arrs,arrs+3);

也就是说,我可以直接把arr数组定义成string,然后一行代码倒入vector,可在这里死活报错!
搞不明白!按C++Primer的作者Stanley B.Lippman的说法,C++程序员应该有编译器的思维方式。


总结

这题对练习掌握选择排序还是很不错的。
可惜C++这么冷门的吗?发现笔者其它乱七八糟的内容还有人看,正经写点C++的反而没人看了…阅读数几周了都还是个位数!或者改用python3来解题会不会看的人多些?
C/C++还是很好的语言,学会了以后可以说:天下就没有看着不眼熟的代码!
也可能是笔者这万金油啥都不精,写得太烂了吧。