SSLOJ1411 最小函数值

Description

问题描述:有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Aix^2+Bix+Ci
( x ∈ N + x∈N_+ xN+)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。

Input

输入数据:第一行输入两个正整数n和m。以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。Ai<=10,Bi<=100,Ci<=10 000。

Output

输出数据:输出将这n个函数所有可以生成的函数值排序后的前m个元素。这m个数应该输出到一行,用空格隔开。

Sample Input

3 10
4 5 3
3 4 5
1 7 1

Sample Output

9 12 12 19 25 29 31 44 45 54

思路

显然,直接把所有共n*m个直接入队,不仅TLE,而且MLE……
发现 x ∈ N + x∈N_+ xN+,所以我们采取这样的策略:先把x=1的所有情况入队,然后我们出队哪一列就再插入那一列。
code:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
struct v{
    
    
	int v,i;
};
int n,m,a[10010],b[10010],c[10010];
bool operator <(const v &x,const v &y)
{
    
    
	return x.v*x.v*a[x.i]+x.v*b[x.i]+c[x.i]>y.v*y.v*a[y.i]+y.v*b[y.i]+c[y.i];
}
priority_queue<v> h;
int main()
{
    
    
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	{
    
    
		cin>>a[i]>>b[i]>>c[i];
		v yy;
		yy.v=1,yy.i=i;
		h.push(yy);
	}
	while (m--)
	{
    
    
		v x=h.top(),yy;
		h.pop();
		cout<<x.v*x.v*a[x.i]+x.v*b[x.i]+c[x.i]<<' ';
		yy.i=x.i,yy.v=x.v+1;
		h.push(yy);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_49843717/article/details/115015248