• 【优先队列】Function


    Function

    题目描述

    wls有n个二次函数Fi(x)=aix2+bix+ci(1≤i≤n)。
    现在他想在且x为正整数的条件下求的最小值。
    请求出这个最小值。

    输入

    第一行两个正整数n,m。
    下面n行,每行三个整数a,b,c分别代表二次函数的二次项,一次项,常数项系数。
    1≤n≤m≤100,000
    1≤a≤1,000
    −1,000≤b,c≤1,000

    输出

    一行一个整数表示答案。

    样例输入

    2 3
    1 1 1
    2 2 2

    样例输出

    13


    【队友的思路】

      每次先把m当成每一份,然后先给n个,剩余的m-n就给当前增长多的那个即可.

    【队友的代码】

     

     1 #pragma GCC optimize(2)
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 typedef long long ll;
     5  
     6 struct node{
     7     ll a, b, c;
     8     ll x, val, pri;
     9  
    10     bool operator < ( const node & rhs )const {
    11         return pri > rhs.pri ;
    12     }
    13 };
    14 priority_queue<node> Q;
    15 int main()
    16 {
    17     int n, m;
    18     scanf("%d%d",&n,&m);
    19     for(int i=1;i<=n;i++)
    20     {
    21         node tmp ;
    22         scanf("%lld%lld%lld",&tmp.a,&tmp.b,&tmp.c);
    23         tmp.x=1;
    24         tmp.pri = 2*tmp.a*tmp.x+tmp.a+tmp.b;
    25         tmp.val = tmp.a*tmp.x*tmp.x+tmp.b*tmp.x+tmp.c;
    26         Q.push(tmp);
    27         //cout<<tmp.val<<endl;
    28     }
    29     for(int i=1;i<=m-n;i++)
    30     {
    31         node tmp=Q.top();
    32         Q.pop();
    33         tmp.x ++ ;
    34         tmp.pri = 2 * tmp.a * tmp.x + tmp.a + tmp.b;
    35         tmp.val = tmp.a * tmp.x * tmp.x + tmp.b * tmp.x + tmp.c;
    36         Q.push(tmp);
    37  
    38     }
    39     ll Ans = 0;
    40     while(!Q.empty())
    41     {
    42         node tmp = Q.top();
    43         Q.pop();
    44         Ans += tmp.val;
    45     }
    46     printf("%lld
    ",Ans);
    47  
    48  
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    2017级面向对象程序设计 作业三
    2017级面向对象程序设计 作业二
    2017级面向对象程序设计 作业一
    寒假作业之总结
    寒假第三次作业
    寒假第二次作业 与电梯有关的代码问题
    我印象中最深刻的三位老师
    Alpha冲刺Day5
    Alpha冲刺Day4
    Alpha冲刺Day3
  • 原文地址:https://www.cnblogs.com/Osea/p/11569218.html
Copyright © 2020-2023  润新知