最先函数值题解

话说这是我写的第一篇题解,哪里不好还望大家多多指教


背景:
本人正在学编程,刚好学到优先队列,教材上有这道题。想来想去,想疯了,还没想出来,于是乎,我就去看题解,结果才发现大佬们写的题解真不是我一萌新理解得了的。我只能说:讲的真好,听得我云里雾里的。

![本人看完题解状态:]


然后,我就做对了题。(~~自然不会是抄题解的了~~)


------------

 正文开始:

 首先读题:
要求算前m个最小的值,而有n个方程,所以说,如果每个方程的x都从1到n枚举一遍,时间复杂度O(n,m),自然会是大家第一个想到的想法了。

然而n,m<=10000

但是,我们要明白,如果x为一个数时,所有f(x)都不在前m
小的值之内的话,再向后继续算(即继续增加x的值)也不会得到前m小的值了。

这一下不就解决了TLE的问题了?


于是乎,干货来了

cpp
bool flag=false;
        for(int j=1;j<=n;j++)
        {

            int s=hs(a[j],i);
            if(ans.size()<m)//未满前m个值
            {
                ans.push(s);
                flag=true;
            }
            else
            {
                if(s<ans.top())//可以挤进前m个值
                {
                    ans.pop();
                    ans.push(s);
                    flag=true;
                }
            }
        }
        if(!flag)//当x为i时没有值能挤进前m个了,break。
            break;

这便是判断当x的值为i时,对n个方程算f(x)的代码了

全部的代码如下:

cpp
#include <bits/stdc++.h>

using namespace std;

struct hang//存储1个方程
{
    int a,b,c;
};

int hs(hang k,int x)//计算
{
    return k.a*x*x+k.b*x+k.c;
}

int main()
{
    priority_queue<long long> ans;
    priority_queue<long long,vector<long long>,greater<long long> > px;
    int n,m;
    cin>>n>>m;
    hang a[n+1];
    for(int i=1;i<=n;i++)
        cin>>a[i].a>>a[i].b>>a[i].c;
    for(int i=1;i<=m;i++)
    {
        bool flag=false;
        for(int j=1;j<=n;j++)
        {

            int s=hs(a[j],i);
            if(ans.size()<m)
            {
                ans.push(s);
                flag=true;
            }
            else
            {
                if(s<ans.top())
                {
                    ans.pop();
                    ans.push(s);
                    flag=true;
                }
            }

            //cout<<
            //cout<<ans.top()<<endl;
        }
        if(!flag)
            break;
    }
    for(int i=1;i<=m;i++)
    {
        px.push(ans.top());
        //cout<<ans.top()<<" ";
        ans.pop();
    }
    for(int i=1;i<=m;i++)
    {
        cout<<px.top()<<" ";
        px.pop();
    }
    return 0;
}


最后说一句,萌新写题解不易,望大家多多支持!谢谢大家

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值