堆排序时间复杂度为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;
}

堆排序的三种优先级设置方法——落谷P2085
堆排序优化:
优先级设置方法(以小根堆为例)
1.比较级重载(最少)

priority_queue<value,vector<value>,less<value> >q; 
//只能是less,不能是greater,下一句是对less中“<"的重载 
bool operator <(value a,value b) {return a.val>b.val;}
2.结构体内部重载

struct value
{
int num,x,val;
friend bool operator <(value a,value b){
return a.val>b.val;
}
}res[100004];
priority_queueq;


3.结构体外部重载

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;
}

相关文章:

  • 2021-10-23
  • 2021-12-24
  • 2022-12-23
  • 2021-10-24
  • 2022-12-23
  • 2022-01-27
  • 2021-12-09
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-21
  • 2021-10-24
  • 2022-12-23
  • 2021-09-30
相关资源
相似解决方案