zoukankan      html  css  js  c++  java
  • P2085 最小函数值 洛谷

    https://www.luogu.org/problem/show?pid=2085

    题目描述

    有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 <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define maxn 1000015
    
    using 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;
    }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    JAVA多线程与并发学习总结
    Java虚拟机类加载机制
    2013网易校园招聘笔试题
    人人网面试题
    2010人人网校园招聘笔试题
    2011人人网校园招聘笔试题
    2012人人网校园招聘笔试题
    2013人人网校园招聘笔试题
    海量数据查找唯一数据问题
    Hulu面试题
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6481003.html
Copyright © 2011-2022 走看看