题目描述
有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。
输入输出格式
输入格式:
输入数据:第一行输入两个正整数n和m。以下n行每行三个正整数,其中第i行的三个数分别位Ai、Bi和Ci。Ai<=10,Bi<=100,Ci<=10 000。
输出格式:
输出数据:输出将这n个函数所有可以生成的函数值排序后的前m个元素。这m个数应该输出到一行,用空格隔开。
输入输出样例
输入样例#1:
3 10 4 5 3 3 4 5 1 7 1
输出样例#1:
9 12 12 19 25 29 31 44 45 54
说明
数据规模:n,m<=10000
堆思路
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define maxn 1000015 using namespace std; int a,b,c,n,m,size; int heap[maxn]; void put(int x) { int now,next; heap[++size]=x; if(size<=m) { now=size; next=now/2; while(next>1) { next=now/2; if(heap[now]<=heap[next]) break; swap(heap[now],heap[next]); now=next; } } else { now=1; heap[now]=heap[size--]; while(now*2<=m) { next=now*2; if(next<m&&heap[next]<heap[next+1]) next++; if(heap[now]>=heap[next]) return; swap(heap[now],heap[next]); now=next; } } } void come_in(int a,int b,int c) { } int main() { cin>>n>>m; cin>>a>>b>>c; for(int x=1;x<=m;x++) { int f=a*x*x+b*x+c; put(f); } n--; while(n--) { cin>>a>>b>>c; for(int x=1;x<=m;x++) { int f=a*x*x+b*x+c; if(f>=heap[1]) break; put(f); } } sort(heap+1,heap+m+1); for(int i=1;i<=m;i++) cout<<heap[i]<<" "; return 0; }
优先队列
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> #define forr(i,j,k) for(i=j;i<=k;i++) using namespace std; priority_queue<int,vector<int>,less<int> >que; priority_queue<int,vector<int>,greater<int> >queu; int n,m,a,b,c; int main() { cin>>n>>m; int x,f; cin>>a>>b>>c; forr(x,1,m) { f=a*x*x+b*x+c; que.push(f); } n--; while(n--) { cin>>a>>b>>c; forr(x,1,m) { f=a*x*x+b*x+c; int topp=que.top(); if(f>=topp) break; que.pop(); que.push(f); } } forr(x,1,m) { int toppp=que.top(); queu.push(toppp); que.pop(); } forr(x,1,m) { cout<<queu.top()<<" "; queu.pop(); } return 0; }
时间: 2024-10-13 12:44:26