cf536c——思路题
Posted lfri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf536c——思路题相关的知识,希望对你有一定的参考价值。
题目
题目:Lunar New Year and Number Division
题目大意:给定一个数字序列,可以任意分组(可调整顺序),但每组至少两个,求每组内数字和的平方的最小值
思路
首先,易证两两分组是最好的。
其次,我们假设将序列${a_i}$分成序列${b_i}$和${c_i}$,所以
$$sum=frac{1}{2}sum_{i=1}^{n}(b_i+c_i)^2$$
我们不关心这部分(因为不管怎么划分,这部分值都不会变):
$$frac{1}{2}sum_{i=1}^{n}(b_i^2+c_i^2)$$
我们仅需考虑$sum_{i=1}^{n}b_ic_i$的最小值,由Rearrangement Inequality(排序原理)知,我们须将大者与小者两两结合。
时间复杂度:$mathcal{O}(n log n)$
代码
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 typedef long long ll; 7 const int maxn = 300000 + 10; 8 int n,a[maxn]; 9 10 11 int main() 12 { 13 scanf("%d", &n); 14 for (int i = 0; i < n; i++) scanf("%d", &a[i]); 15 sort(a, a + n); 16 ll ans = 0; 17 for (int i = 0; i < n / 2; i++) 18 ans += (ll)1 * (a[i] + a[n - 1 - i]) * (a[i] + a[n - 1 - i]); 19 printf("%I64d ", ans); 20 return 0; 21 }
参考链接:https://codeforces.com/contest/1106/problem/C
以上是关于cf536c——思路题的主要内容,如果未能解决你的问题,请参考以下文章