堆排序时间复杂度为O(nlogn)与快速排序时间复杂度相同,且不会退化,快排会退化。
原题:https://www.luogu.org/problemnew/show/P2085
非堆排序解法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,i,j,cmin,jmin;
int A[10010],B[10010],C[10010];
int F[10010];
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>A[i]>>B[i]>>C[i];
F[i]=1;
}
for(i=0;i<m;i++)
{
cmin=100000000;
for(j=0;j<n;j++)
{
if(A[j]*F[j]*F[j]+B[j]*F[j]+C[j]<cmin)
{
cmin=A[j]*F[j]*F[j]+B[j]*F[j]+C[j];
jmin=j;
}
}
cout<<cmin<<' ';
F[jmin]++;
}
return 0;
}
堆排序优化:
优先级设置方法(以小根堆为例)
1.比较级重载(最少)
priority_queue<value,vector<value>,less<value> >q;
//只能是less,不能是greater,下一句是对less中“<"的重载
bool operator <(value a,value b) {return a.val>b.val;}
2.结构体内部重载(operator必须有返回值类型)
struct value
{
int num,x,val;
friend bool operator <(value a,value b){
return a.val>b.val;
}
}res[100004];
priority_queue<value>q;
3.结构体外部重载(operator必须有返回值类型)
struct cmp{//注意返回值的类型
bool operator()(value a,value b){
return a.val>b.val;
}
};
//cmp的定义必须要在优先队列的上面
priority_queue<value,vector<value>,cmp>q;
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct func
{
int a,b,c;
} f[10004];
struct value
{
int num,x,val;
}res[100004];//比较级重载
priority_queue<value,vector<value>,less<value> >q;
//只能是less,不能是greater,下一句是对less中“<"的重载
bool operator <(value a,value b) {return a.val>b.val;}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&f[i].a ,&f[i].b ,&f[i].c );
q.push((value){i,1,f[i].a +f[i].b +f[i].c});
}
for(int i=1;i<=m;i++){
value t=q.top();
q.pop();
cout<<t.val <<" ";
q.push((value){t.num ,t.x +1,f[t.num ].a *(t.x +1)*(t.x +1)+f[t.num ].b *(t.x +1)+f[t.num ].c } );
}
return 0;
}
#include<bits/stdc++.h>//结构体内部
using namespace std;
int n,m;
struct func
{
int a,b,c;
} f[10004];
struct value
{
int num,x,val;
friend bool operator <(value a,value b){
return a.val>b.val;
}
}res[100004];
priority_queue<value>q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&f[i].a ,&f[i].b ,&f[i].c );
q.push((value){i,1,f[i].a +f[i].b +f[i].c});
}
for(int i=1;i<=m;i++){
value t=q.top();
q.pop();
cout<<t.val <<" ";
q.push((value){t.num ,t.x +1,f[t.num ].a *(t.x +1)*(t.x +1)+f[t.num ].b *(t.x +1)+f[t.num ].c } );
}
return 0;
}
#include<bits/stdc++.h>//结构体外部
using namespace std;
int n,m;
struct func
{
int a,b,c;
} f[10004];
struct value
{
int num,x,val;
}res[100004];
struct cmp{
bool operator()(value a,value b){
return a.val>b.val;
}
};
priority_queue<value,vector<value>,cmp>q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&f[i].a ,&f[i].b ,&f[i].c );
q.push((value){i,1,f[i].a +f[i].b +f[i].c});
}
for(int i=1;i<=m;i++){
value t=q.top();
q.pop();
cout<<t.val <<" ";
q.push((value){t.num ,t.x +1,f[t.num ].a *(t.x +1)*(t.x +1)+f[t.num ].b *(t.x +1)+f[t.num ].c } );
}
return 0;
}