tokitsukaze and Soldier 优先队列+排序

登录—专业IT笔试面试备考平台_牛客网

对各种STL容器还是不太熟悉以及自己的贪心策略总是太想当然了。QAQ

优先队列默认从大到小,加上greater以后从小到大。

优先队列用法 - skyli - C++博客

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define INF 0x3f3f3f3f
#define PII pair<int, int>
#define rep(i, l, r) for (int i = l; i < r; i++)
#define per(i, l, r) for (int i = l; i >= r; i--)
#define rep2(i, l, r) for (int i = l; i * i <= r; i++)
#define rep3(i, l, r) for (LL i = l; i * i * i <= r; i++)
#define Min(a, b) a > b ? b : a
#define Max(a, b) a > b ? a : b
#define endl '\n'
#define debug "-----"
using namespace std;
typedef long long LL;
const LL mod = 1e9;
const int N = 1e5 + 10, M = 10100;
LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }

priority_queue<LL, vector<LL>, greater<LL>> pq;
struct Node
{
	int v,s;
}sol[N];

bool cmp( Node a , Node b ){
	return a.s > b.s;
}

int main()
{
	IOS;
	int n;
	cin >> n;
	rep( i , 1 , n+1 ) 
		cin >> sol[i].v >> sol[i].s;
	sort( sol+1 , sol+1+n , cmp );
	LL ans = 0 , res = 0;
	rep( i , 1 , n+1 ){
		res += sol[i].v;
		pq.push( sol[i].v );
		while( pq.size() > sol[i].s ){
			res -= pq.top();
			pq.pop();
		}
		ans = max( res , ans );
	}
	cout << ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
士兵队列训练问题可以利用链队列进行求解。 具体过程如下: 1. 定义士兵结构体类型,包括姓名、编号等信息。 2. 定义队列节点结构体类型,包括士兵信息和指向下一个节点的指针。 3. 定义队列结构体类型,包括队头和队尾指针。 4. 初始化队列,即将队头和队尾指针都置为空。 5. 将士兵依次加入队列中,可以采用尾插法。 6. 训练开始时,从队头取出一个士兵进行训练,训练结束后将其从队列中删除。 7. 将训练结束后的士兵重新插入队列的尾部。 8. 重复进行步骤6和7,直到队列为空。 下面是一份C++代码示例: ```cpp #include <iostream> #include <string> using namespace std; // 定义士兵结构体 struct Soldier { string name; int id; }; // 定义队列节点结构体 struct Node { Soldier soldier; Node* next; }; // 定义队列结构体 struct Queue { Node* front; Node* rear; }; // 初始化队列 void initQueue(Queue& q) { q.front = q.rear = nullptr; } // 判断队列是否为空 bool isEmpty(Queue q) { return q.front == nullptr; } // 入队 void enqueue(Queue& q, Soldier s) { Node* newNode = new Node; newNode->soldier = s; newNode->next = nullptr; if (isEmpty(q)) { q.front = q.rear = newNode; } else { q.rear->next = newNode; q.rear = newNode; } } // 出队 Soldier dequeue(Queue& q) { Soldier s; if (!isEmpty(q)) { Node* p = q.front; s = p->soldier; q.front = p->next; if (q.front == nullptr) { q.rear = nullptr; } delete p; } return s; } int main() { Queue q; initQueue(q); // 添加士兵到队列中 Soldier s1 = {"Tom", 1}; Soldier s2 = {"Jerry", 2}; Soldier s3 = {"Mike", 3}; enqueue(q, s1); enqueue(q, s2); enqueue(q, s3); // 训练士兵队列 while (!isEmpty(q)) { Soldier s = dequeue(q); cout << "Soldier " << s.id << " " << s.name << " is training." << endl; // 模拟训练 cout << "Soldier " << s.id << " " << s.name << " finished training." << endl; enqueue(q, s); } return 0; } ``` 以上代码实现了士兵队列训练问题的链队列求解过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值