今天是我的码龄100天,庆祝🎉一下吧
今天来说一下一道经典的题目——合并果子。
题目
首先,这里有一个朴素的算法——快排(sort)+插排
运用快排进行第一次排序,再利用经典的插排思想,对每一次结果进行处理。
Code
#include<bits/stdc++.h>
using namespace std;
int n,a[10100],s,k;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<n;i++){
k=i;
s=s+a[i]+a[i+1];
a[i+1]+=a[i];
k+=1;
while(a[k]>a[k+1]&&k<n){
k++;
swap(a[k],a[k-1]);
}
}
cout<<s;
return 0;
}
第二种是用优先队列priority_queue
#include<bits/stdc++.h>
using namespace std;
long long n,sum;
priority_queue<long long,vector<long long>,greater<long long> > q;
int main(){
cin>>n;
for(int x,i=1;i<=n;i++){
cin>>x;
q.push(x);
}
for(int i=1;i<n;i++){
long long a1=q.top();
q.pop();
long long a2=q.top();
q.pop();
q.push(a1+a2);
sum+=a1+a2;
}
cout<<sum;
return 0;
}