2021-07-22 华为笔试复盘 2.仪器云使用的调度 sort函数&&lambda表达式&&运算符重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一个方法:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Node{
	int t, p;
	bool operator <(const Node & a)const{ //小于号重载
		if (this->p == a.p){ //如果权值相等
			return this->t>a.t;//时间从大到小排序
		}
		else{
			return this->p<a.p;//否则权值从小到大排序
		}
	}
}node[1000];//题干条件
int ans[1000];
int main()
{
	int n, k;
	cin >> n >> k;
	for (int i = 1; i <= k; ++i){
		cin >> node[i].t >> node[i].p;
	}
	sort(node + 1, node + k + 1);//将节点从1到k排序


	for (int i = 1; i <= k; ++i){
		int index = min_element(ans + 1, ans + 1 + n) - ans;//都是从下标1开始的
		ans[index] += node[i].t;
	}
	cout << *max_element(ans + 1, ans + 1 + n)<<endl;
	system("pause");
	return 0;
}

这个方法比较好理解!!
主要分成三步:
① 定义一个结构体,包含两种属性,定义一个存储这种结构体的数组
② 重载小于号 用sort对数组按照规则排序
在这里插入图片描述
③ 维护一个数组 里面有k个元素 每次找最小的元素加时间
第一次存k个数 index从1到k(k=3)
在这里插入图片描述
下一次存的时候 找当前第一个最小的下标 将t累加
在这里插入图片描述
在这里插入图片描述
最后得出结果

int index = min_element(ans + 1, ans + 1 + n) - ans;

第二个方法:
优先级队列(虽然改的稍微易懂了一点 但还是不懂 唉)

#include <iostream>
#include <queue>
#include <xfunctional>
using namespace std;

struct node {
	int t, p;//p是优先级(越小越好)  t是使用时间(越大越好)
	bool operator< (const node &a) const {
		if (this->p == a.p) return this->t < a.t;//从大到小 //和sort相反
		return this->p > a.p;//从小到大
	}
};

int main() {
	int n, k;
	cin >> n >> k;

	priority_queue<node> que1;
	priority_queue<int, vector<int>, greater<int>> que2;
	for (int i = 0; i < k; ++i) {
		node kk;
		int t, p;
		cin >>kk.t>> kk.p;
		que1.push(kk);
	}
	int ans = 0;//往下就不懂了
	if (k < n) {
		while (!que1.empty()) {
			node temp = que1.top();
			ans = max(ans, temp.t);
			que1.pop();
		}
		cout << ans << endl;
		return 0;
	}
	// k >= n的情况
	for (int i = 0; i < n; ++i) {
		que2.push(que1.top().t);
		que1.pop();
	}
	while (!que2.empty()) {
		int t = que2.top();
		ans = max(ans, t);
		if (!que1.empty()) {
			node k = que1.top();
			que2.push(k.t + t);
			que1.pop();
		}
		que2.pop();
	}
	cout << ans << endl;
	system("pause");
	return 0;
}




第三个方法没看懂:
排序后的pair:
在这里插入图片描述

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e3+ 10, mod = 1e9 + 7, inf = 0x3f3f3f3f;
int n, k, ans[maxn];//仪器数量 需要使用仪器的设备数量 
pair<int, int> a[maxn];
int main(){
	cin >> n >> k;
	for (int i = 1; i <= k; i++){
		cin >> a[i].second >> a[i].first;//先存优先级 再存使用时间
	}
	sort(a + 1, a + 1 + n, 
		// Lambda expression begins
		[](pair<int, int> a, pair<int, int> b){
		if (a.first == b.first)
			return a.second > b.second;//使用时间
		return a.first < b.first;//优先级
	   }// end of lambda expression
	);
	for (int i = 1; i <= k; i++){
		int min_pos = min_element(ans + 1, ans + 1 + n) - ans;//查询最小值所在的第一个位置
		ans[min_pos] += a[i].second;
	}
	cout << *max_element(ans + 1, ans + 1 + n)<<endl;//查询最大值所在的第一个位置
	system("pause");
	return 0;
}

sort函数用法

在这里插入图片描述
在这里插入图片描述

lambda表达式

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值