题目大意
题目链接 (可能需要翻墙)
给定a,b,c, 定义 $score = a^2 + b^2 + c^2+7\cdot \min(a,b,c)$
现在给出一个d,要将d拆成三份作为a,b,c的增量,即赋值a += d1, b += d2, c += d3
, 满足d1, d2, d3 >= 0, d1 + d2 + d3 = d
求score的最大值。
题目分析
注意到加上d后,前面平方项的增量是O(d^2)级别,后面min(a,b,c)这项是O(d)级别,所以当d比较大时,把d全部加给a b c中的最大值即可;d比较小时,暴力一一验证即可。
source code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; int main(){ trueint n; truecin>>n; truefor (int i=1;i<=n;++i){ truetruell a,b,c,d; truetruecin>>a>>b>>c>>d; truetruell sz0 = 4, sz1 = 10; truetrueif (a < sz0 && b < sz0 && c < sz0 && d < sz1) { truetruetruell ans = a*a+b*b+c*c+7*min(a,min(b,c)); truetruetruefor (ll d1 = 0; d1 <= d; d1++) truetruetruefor (ll d2 = 0, d3 = d - d1 - d2; d2 <= d && d3 >= 0; d2++, d3 = d - d1 - d2) { truetruetruetrueans = max(ans, (a+d1)*(a+d1)+(b+d2)*(b+d2)+(c+d3)*(c+d3)+7*min(a+d1, min(b+d2,c+d3))); truetruetrue} truetruetruecout << ans << endl; truetruetruecontinue; truetrue} truetruell mat=max(max(a,b),c); truetruell t1=ll(a+d)*(a+d)+(ll)b*b+(ll)c*c+ll(7)*min(min(a+d,b),c); truetruell t2=ll(a)*a+ll(b+d)*(b+d)+(ll)c*c+ll(7)*min(min(a,b+d),c); truetruell t3=ll(a)*a+ll(b)*b+ll(c+d)*(c+d)+ll(7)*min(min(a,b),c+d); truetruecout<<max(t1,max(t2,t3))<<endl; true} truereturn 0; }
|
Last updated: