P2085 最小函数值 堆

  

题目描述

有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<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=100000+5;
int a[N];
int b[N];
int heap[N];
int from[N];
int now[N];
struct node
{
    int a,b,c;
    int now;
    int v;
    bool operator< (const node & b)const
    {
        return v>b.v;
    }
}s[N];

int main()
{
   priority_queue<node>q;
   int n,m;
   RII(n,m);
   rep(i,1,n)
   RIII(s[i].a,s[i].b,s[i].c),s[i].now=0;
   rep(i,1,n)
   {
       s[i].now++;
       int x=s[i].now;
       s[i].v=s[i].a*x*x+s[i].b*x+s[i].c;
       q.push(s[i]);
   }
    int cnt=1;
    node head;
    int last;
    while(cnt<=m)
    {
        head=q.top();q.pop();
        printf("%d ",head.v);
        int x=++head.now;
        head.v=( head.a*x*x+head.b*x+head.c);
        q.push(head);
        cnt++;
    }

    return 0;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10804445.html