![](https://img.haomeiwen.com/i17401788/4ed16b357a15ae7c.png)
![](https://img.haomeiwen.com/i17401788/c31cdc6821b63b7b.png)
找到最小的和次小的相加
![]()
1.Fence Repair
第一种做法:按照白书所说用树的方法
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int l[20001],n;
int main(){
// freopen("data","r",stdin);
while(scanf("%d",&n)!=EOF){
long long int ans=0;
for(int i=0;i<n;i++)
scanf("%d",&l[i]);
while(n>1){
//求出最短min1,次短min2
int min1=0,min2=1;
if(l[min1]>l[min2])
swap(min1,min2);
for(int i=2;i<n;i++)
{
if(l[min1]>l[i]){
min2=min1;
min1=i;
}
else if(l[min2]>l[i])
min2=i;
}
//合并
int t=l[min1]+l[min2];
ans+=t;
if(min1==n-1)
swap(min1,min2);
l[min1]=t;
l[min2]=l[n-1];//没有用的
//因为最终要更改的是min1,一行里面的数会越缩越小,所以要逐渐的舍弃最后一个;
n--;
}
printf("%lld\n",ans);
}
return 0;
}
第二种做法:采用某某火最不会的优先队列:定义一个从小到大排列的优先队列,答案累加记录它们的和,知道优先队列剩下最后一个元素//这个代码工作量少挺多的
顺便补一补优先级队列//再完全不会的情况下,具体的嘛,就去看看优先队列的简书,比赛打完后在整理一下叭
- priority_queue<int> qi;//普通的优先级队列,按从大到小排序
- priority_queue<int, vector<int>, greater<int> > qi2;//从小到大的优先级队列,可将greater改为less,即为从大到小
代码
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
using namespace std;
priority_queue<int,vector<int>,greater<int> > que;//从小到大
ll n,ans;
int main(){
// freopen("data","r",stdin);
cin>>n;
ll l;
for(int i=0;i<n;i++){
cin>>l;
que.push(l);//先进先出
}
while(que.size()>1){
ll x=que.top();
que.pop();
ll y=que.top();
que.pop();
ans+=x+y;
que.push(x+y);
}
cout<<ans<<endl;
return 0;
}
Hyperhuffman
There is a blank line between input blocks.这句话就是个坑,blocks就是T
代码
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
typedef long long ll;
using namespace std;
ll n,ans;
int main(){
// freopen("data","r",stdin);
int T;
cin>>T;
for(int j=0;j<T;j++)
{
cin>>n;
ll l;
ans=0;
priority_queue<ll,vector<ll>,greater<ll> > que;//从小到大
for(int i=0;i<n;i++){
cin>>l;
que.push(l);//先进先出
}
while(que.size()>1){
ll x=que.top();
que.pop();
ll y=que.top();
que.pop();
ans+=x+y;
que.push(x+y);
}
cout<<ans<<endl;
if(j<T-1)
cout<<endl;
}
return 0;
}
网友评论