首页 > 代码库 > 最小函数值

最小函数值

题目描述

有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;}

 

最小函数值