zoukankan      html  css  js  c++  java
  • 最小函数值(堆)

    最小函数值

    题目描述

    有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Aix^2+Bix+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


    题解

    这道题好像是超级钢琴的解法思路之一呢。。
    我们只要模拟一下就好了。
    这次选哪一个方程式。
    然后让方程式的x++。
    game over


    代码

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    priority_queue<pair<long long,int> >q;
    long long n,m;
    struct node{
        long long a,b,c,cnt;
    }ch[500010];
    int read(){
        int x=0,w=1;char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    
    void solve(){
        printf("%lld ",-q.top().first);//q.pop();
        int i=q.top().second;q.pop();
        ch[i].cnt++;
        long long x=ch[i].a*ch[i].cnt*ch[i].cnt+ch[i].b*ch[i].cnt+ch[i].c;
        q.push(make_pair(-x,i));
    }
    
    int main(){
        n=read();m=read();
        for(int i=1;i<=n;i++){
            ch[i].a=read();ch[i].b=read();ch[i].c=read();ch[i].cnt=1;
            q.push(make_pair(-(ch[i].a+ch[i].b+ch[i].c),i));
        }
        while(m--)solve();
        return 0;
    }
    
  • 相关阅读:
    在线|九月月考选填题
    函数$f(x)=e^xpm e^{-x}$相关
    偶函数性质的推广
    2020年全国卷Ⅱ卷文科数学选填题解析版
    2020年全国卷Ⅱ卷文科数学解答题解析版
    待定系数法
    特殊方法求函数解析式
    phd文献阅读日志-4.1
    phd文献阅读日志-1.2~3.2(1.2,2.1,2.2,3.1,3.2)
    完美解决linux下vim在终端不能用鼠标复制的问题
  • 原文地址:https://www.cnblogs.com/hhh1109/p/9571625.html
Copyright © 2011-2022 走看看