洛谷 P2085 最小函数值(minval)

原创 2016年06月01日 13:15:42


题目描述

有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


【分析】


对于一道为数不多的一次AC的题,我有必要发一个简单而清晰的题解。(其实我是来装b的【滑稽】)

由于这道题中函数的对称轴是在y轴左侧(即对称轴横坐标为负),所以在正整数范围内啊它是单调递增哒。这就很好办啦

我们首先用第一组数据(即第二行的数据)建一个有m个数的大根堆。然后往里面加其他数据的数。

我觉得讲的挺清楚的了吧。。那就贴个C++代码

//P2085 最小函数值(minval)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
int h[10002];
int size=0,n,m;   //size就是堆中数字的个数
void put(int f)
{
    int now,next;
    h[++size]=f;
    if(size>m)    //这个是加数字的情况
    {
        h[1]=h[size--];
        now=1;
        while(2*now<=m)
        {
            next=2*now;
            if(next<=m-1&&h[next+1]>h[next]) next++;
            if(h[now]>=h[next]) return;
            swap(h[now],h[next]);  //三变量交换法
            now=next;
        }
    }
    else    //这个是建立初始堆
    {
        now=size;
        while(now/2>=1)
        {
            next=now/2;
            if(h[next]>=h[now]) return;
            swap(h[next],h[now]);  
            now=next;
        }
    }
}
int main()
{
    int i,j,k,a,b,c,f,x;
    scanf("%d%d",&n,&m);
    n--;
    scanf("%d%d%d",&a,&b,&c);
    fo(x,1,m)    //建堆 
    {
        f=a*x*x+b*x+c;
        put(f);
    }  
    while(n--)
    {
        scanf("%d%d%d",&a,&b,&c);
        fo(x,1,m)
        {
            f=a*x*x+b*x+c;  
            if(f>=h[1]) break;   //如果这个数比堆中最大的数还大,那么就看下一组数据了
            put(f);   //添加数字
        }
    }
    sort(h+1,h+m+1);
    fo(i,1,m) printf("%d ",h[i]);
    return 0;
}


版权声明:本文为博主原创文章,转发请注明地址

洛谷 P2085 最小函数值(minval)

题目描述有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。输...
  • liangzihao1
  • liangzihao1
  • 2017年03月16日 21:18
  • 128

洛谷 P2085 最小函数值

本来是8.3 模拟考 因为昨天沈阳蜜汁暴雨预警 导致变成8.4模拟考 第一题 因为a,b,c都为正整数 所以  对称轴一定在原点左侧而且在x正半轴上单调递增  因此 不要想太多 不需要考虑原...
  • Misfit2001
  • Misfit2001
  • 2017年08月04日 14:01
  • 93

LUOGU P2085 最小函数值

题目描述有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。输...
  • superdata999
  • superdata999
  • 2017年12月16日 00:29
  • 49

最小函数值 洛谷2085 堆

题目描述有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。输...
  • jpwang8
  • jpwang8
  • 2017年02月08日 20:52
  • 147

洛谷2085最小函数值(minval) + 洛谷1631序列合并

题目描述有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。输...
  • KenxHe
  • KenxHe
  • 2016年10月30日 20:32
  • 160

洛谷2085 最小函数值

题目描述有n个函数,分别为F1,F2,…,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个)。输...
  • qq_40448823
  • qq_40448823
  • 2017年12月10日 20:06
  • 47

洛谷 堆专题 最小函数值

题目描述 有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输...
  • masterwater
  • masterwater
  • 2017年01月18日 16:31
  • 137

洛谷试炼场---新手村

洛谷试炼场---新手村 洛谷的第一个任务 1.p1001 A+B Problem 难度:入门难度 考点:输入,输出 ,整数四则运算   适用:小学生 #include int main()...
  • mrcrack
  • mrcrack
  • 2017年03月11日 16:09
  • 1126

洛谷P1273 有线电视网

有线电视网 本题地址: http://www.luogu.org/problem/show?pid=1273题目描述某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构...
  • QWsin
  • QWsin
  • 2016年03月22日 14:07
  • 569

对于洛谷提高试炼场-动态规划篇的爆破

题外话 由于本蒟蒻的动态规划实在是太弱啦,所以有必要爆破一下洛谷提高试炼场。里面有很多非常好,难度也合适的动态规划题……(然而你还是抄了不少题解) niconiconi!让我们一起开始爆破吧。 ...
  • litble
  • litble
  • 2017年11月05日 19:53
  • 115
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:洛谷 P2085 最小函数值(minval)
举报原因:
原因补充:

(最多只允许输入30个字)