优先队列
作业介绍
#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 小时