Problem Description
wls 有 n 个二次函数 Fi(x) = aix2 + bix + ci (1 ≤ i ≤ n).
现在他想在∑ni=1xi = m 且 x 为正整数的条件下求∑ni=1Fi(xi)的最小值。
请求出这个最小值。
Input
第一行两个正整数 n, m。
下面 n 行,每行三个整数 a, b, c 分别代表二次函数的二次项, 一次项,常数项系数。
1 ≤ n ≤ m ≤ 100, 000
1 ≤ a ≤ 1, 000
−1, 000 ≤ b, c ≤ 1, 000
Output
一行一个整数表示答案。
Sample Input
2 3
1 1 1
2 2 2
Sample Output
13
Source
思路
-
由 n == m 得 所有的 x=1 得总值
-
如果 n<m 由下可知 x=1 f=a+b+c 相差 3a+b x=2 f=4a+2b+c 相差 5a+b x=3 f=9a+3b+c 相差 7a+b x=4 f=16a+4b+c 相差 9a+b x=5 f=25+5b+c 就是(2x+1)a+b
代码
#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;
}