第一个方法:
#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函数用法