首页 > 代码库 > 最小函数值
最小函数值
题目描述
有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 104 5 33 4 51 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 1000015using 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;}
最小函数值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。