今天浅学了一下堆,发现这种东西简直就是为合并果子而生的啊!!!不仅风格上好看很多,而且很好理解啊!!而且c++模板库STL里面就只有堆的函数理解到了一点(蠢死了蠢死了
以下放原来用贪心的代码和用堆的进行对比:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<iomanip>
#include<stack>
#include<climits>
#include<ctype.h>
using namespace std;
int b[30005],a[30005],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",a+i);
sort(a+1,a+n+1);
int ans=0,t,m=0,i=1,j=1;
for(int k=1;k<=n-1;k++){//贪心,其实每次都要反复理解,要不然很容易就忘了
if(m<j||i<=n&&a[i]<b[j])
t=a[i++];
else
t=b[j++];
if(m<j||i<=n&&a[i]<b[j])
t+=a[i++];
else
t+=b[j++];
ans+=t;
b[++m]=t;
}
cout<<ans;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<cctype>
#include<vector>
using namespace std;
int heap_size,n;
int heap[30001];
void put(int d)
{
heap[++heap_size]=d;
push_heap(heap+1,heap+heap_size+1,greater<int>());//STL
}
int get()
{
pop_heap(heap+1,heap+heap_size+1,greater<int>());
return heap[heap_size--];
}
void work()
{
int x,y,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
put(x);
}
for(int i=1;i<n;i++){
x=get();//每次取两个小的合并
y=get();
ans+=x+y;
put(x+y);//将合并后的插入小根堆
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(0);//读入优化
work();
return 0;
}
继续努力。