最小函数值,洛谷之提高历练地,堆

正题

      第四题:最小函数值

      我们还是仿照第三题的做法,我们先维护一个大根堆,使大根堆里面有m个元素,然后每次加入新的x,看一下是否小于堆顶,如果可以,那就更换堆顶,这样我们就可以保证是最小的m个,那么当没有元素可以加到堆内,就是我们的结束。

#include
#include
#include
#include
#include
using namespace std;

int n,m;
bool tf[10010];
priority_queue f;
struct node{
	long long a,b,c;
}s[10010];
int t[10010];
int tot;

int main(){
	scanf("%d %d",&n,&m);
	tot=n;
	for(int i=1;i<=n;i++) scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c);
	int q=1,tt=1;
	while(q<=m){
		for(int i=1;i<=n;i++){
			long long yy=s[i].a*tt*tt+s[i].b*tt+s[i].c;
			f.push(yy);
			q++;
		}
		tt++;
	}
	while(q>m+1) f.pop(),q--;
	while(tot>0){
		for(int i=1;i<=n;i++){
			if(tf[i]==false){
				long long now=s[i].a*tt*tt+s[i].b*tt+s[i].c;
				if(now>=f.top()) {
					tf[i]=true,tot--;
					continue;
				}
				f.pop();
				f.push(now);
			}
		}
		tt++;
	}
	while(!f.empty())
		t[++tot]=f.top(),f.pop();
	for(int i=tot;i>=1;i--)
		printf("%d ",t[i]);
}

      

你可能感兴趣的:(最小函数值,洛谷之提高历练地,堆)