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\n",Ans); 47 48 49 return 0; 50 }View Code