优先队列

作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int n,m,a[N];
int check(int x){
	//舞台上最多有x头牛,能否完成任务
	priority_queue<int,vector<int>,greater<int> >q;
	for(int i=1;i<=n;i++){
		if(i<=x){
			q.push(a[i]);
		}
		else{
			int res = q.top();q.pop();
			q.push(res+a[i]);
		}
	}
	int res = 0;
	while(!q.empty()){
		res = max(res,q.top());
		q.pop();
	}
	return res<=m;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int l=1,r=100000,ans=-1;
	while(l<=r){
		int mid = (l+r)/2;
		if(check(mid)){
			ans = mid;
			r = mid-1;
		}
		else l = mid+1;
	}
	cout<<ans<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+5;
#define int long long
int n,a[N];
priority_queue<int,vector<int>,greater<int> >q;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		q.push(x);
	}
	int res = 0;
	while(q.size()>1){
		int t1 = q.top();q.pop();
		int t2 = q.top();q.pop();
		res+=t1+t2;
		q.push(t1+t2);
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
/*
1 3 5 7 9 11 6
大堆(较小的那一半的数):1
小堆(较大的那一半的数):3
1
3
5
6
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n,a[N];
priority_queue<int>q1;
priority_queue<int,vector<int>,greater<int> >q2;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	q2.push(a[1]);
	cout<<a[1]<<endl;
	for(int i=2;i<=n;i++){
		if(a[i]>q2.top())q2.push(a[i]);
		else q1.push(a[i]);
		//1.两个堆元素个数相同
		//2.两个堆元素个数不同,差为1
		//3.两个堆元素个数不同,差为2
		
		if(int(q1.size())-int(q2.size())>=2){
			//cout<<q1.size()<<" "<<q2.size()<<endl;
			q2.push(q1.top());
			q1.pop();
		}
		else if(int(q2.size())-int(q1.size())>=2){
			//cout<<q2.size()<<" "<<q1.size()<<endl;
			q1.push(q2.top());
			q2.pop();
		}
		if(i%2==1){
			if(q1.size()>q2.size())cout<<q1.top()<<endl;
			else cout<<q2.top()<<endl;
		}
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N],b[N],n;
priority_queue<int>q;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(q.size()<n)q.push(a[i]+b[j]);
			else{
				if(a[i]+b[j]<q.top()){
					q.pop();
					q.push(a[i]+b[j]);
				}
				else{
					break;
				}
			}
		}
	}
	vector<int>v;
	while(!q.empty()){
		v.push_back(q.top());
		q.pop();
	}
	reverse(v.begin(),v.end());
	for(int i=0;i<v.size();i++){
		cout<<v[i]<<" ";
	}
	return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
10
开始时间
2026-7-7 0:00
截止时间
2026-7-15 23:59
可延期
24 小时