wls 有 n 个二次函数 Fi(x) = aix2 + bix + ci (1 ≤ i ≤ n).
现在他想在∑ni=1xi = m 且 x 为正整数的条件下求∑ni=1Fi(xi)的最小值。
请求出这个最小值。
第一行两个正整数 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
由 n == m 得
所有的 x=1 得总值
如果 n#include "bits/stdc++.h"
using namespace std;
#define ll long long
struct ppp
{
ll a,b,c,x;
ll ans;
bool operator <(const ppp &x) const
{
if(ans==x.ans)
return a>x.a;
return ans>x.ans;
}
}t;
priority_queue<ppp>q;
int main()
{
ll n,m;
ll sum=0;//记录总值
cin>>n>>m;
for(int i=1;i<=n;i++)
{
t.x=1;//一开始所有的x=1
cin>>t.a>>t.b>>t.c;
sum+=t.a+t.b+t.c;//x=1的结果
t.ans=(2*t.x+1)*t.a+t.b; //x 与 x+1 的差值 (2x+1)a+b
q.push(t);
}
m-=n;
while(m--)
{
t=q.top();
q.pop();
t.x++;
sum+=t.ans;//加上差值
t.ans=(2*t.x+1)*t.a+t.b;
q.push(t);
}
cout<<sum<<endl;
}