C++信奥老师解一本通题 1370:最小函数值(minval)

【题目描述】

有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x*x+Bi*x+Ci(x∈N∗)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的mm个(如有重复的要输出多个)。

【输入】

第一行输入两个正整数n和m。

以下nn行每行三个正整数,其中第ii行的三个数分别位Ai、Bi和Ci输入数据保证Ai<=10,Bi<=100,Ci<=10000。

【输出】

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

【输入样例】

3 10
4 5 3
3 4 5
1 7 1

【输出样例】

9 12 12 19 25 29 31 44 45 54

【提示】

【数据规模】

n,m≤10000。

#include <bits/stdc++.h>
using namespace std;
int tmp[10001];
int main()
{
	int n,m,a,b,c;
	priority_queue<int> pq; //最大堆 
	cin>>n>>m;
	for(int i=1;i<=n;i++)  //循环读取n行的 Ai Bi Ci 
	{
		cin>>a>>b>>c;
		for(int x=1;x<=m;x++)	//F(x) 递增,循环到m就成了
		{
			int fx=a*x*x+b*x+c;
			pq.push(fx);
			if(pq.size()>m)      
				pq.pop();
			if(fx>pq.top())		//如果值比最大堆的堆顶还大,则没必要再继续循环下去 
				break;
		}	
	}
	for(int i=1;i<=m;i++)
	{
		tmp[i]=pq.top();
		pq.pop();
	}
	for(int i=m;i>=1;i--)
		cout<<tmp[i]<<" ";
	return 0;
}

 

posted @ 2024-09-17 14:19  信奥赛老师  阅读(160)  评论(0)    收藏  举报