解题思路:
暴力能过5个点,25分。(vector数组实现删数,for循环寻找最小数,每删除一次循环一次)
最小堆,有stl库优先队列priority_queue,堆排序啥的不用咱写了,直接push往里放数就行,存的时存两个值,这个数和这个数的下标,用pair存
注意事项:
存的数组e[ ]开long long
删数加数更新后的数要继续存入堆里
参考代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
typedef long long ll;
int e[N],l[N],r[N],idx;
int n,k;
void init(){
r[0]=1,l[1]=0;
idx=2;
}
void insert(int a,int x){
e[idx]=x;
l[idx]=a,r[idx]=r[a];
l[r[a]]=idx,r[a]=idx++;
}
void del(int x){
l[r[x]]=l[x];
r[l[x]]=r[x];
e[l[x]]+=e[x],e[r[x]]+=e[x];
}
int main(){
cin>>n>>k;
init();
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> h;
for(int i=1;i<=n;i++){
int x;
cin>>x;
insert(l[1],x);
h.push({x,i+1});
}
while(k--){
auto p=h.top();h.pop();
if(p.first!=e[p.second]) h.push({e[p.second],p.second}),k++;
else del(p.second);
}
int tt=0;
while(r[tt]!=1){
tt=r[tt];
cout<<e[tt]<<" ";
}
return 0;
}
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:1215 |
WU-蓝桥杯算法提高VIP-勾股数 (C++代码)浏览:1685 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:672 |
幸运数 (C++代码)浏览:1309 |
母牛的故事 (C语言代码)浏览:1046 |
2^k进制数 (C语言描述,蓝桥杯)浏览:1457 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:756 |
剪刀石头布 (C语言代码)浏览:1519 |
交换Easy (C语言代码)浏览:805 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:538 |