题目描述
Highway 201 is the most busy street in Rockport. Traffic cars cause a lot of hindrances to races, especially when there are a lot of them. The track which passes through this highway can be divided into n sub-tracks. You are given an array aa where a_i represents the number of traffic cars in the i -th sub-track. You define the inconvenience of the track as sumlimits_{i=1}^{n} sumlimits_{j=i 1}^{n} lvert a_i-a_jrvert , where |x| is the absolute value of x .
You can perform the following operation any (possibly zero) number of times: choose a traffic car and move it from its current sub-track to any other sub-track.
Find the minimum inconvenience you can achieve.
输入格式
The first line of input contains a single integer t ( 1leq tleq 10,000) — the number of test cases.
The first line of each test case contains a single integer n ( 1leq nleq 2cdot 10^5).
The second line of each test case contains n integers a_1, a_2, ldots, a_n ( 0leq a_ileq 10^9).
It is guaranteed that the sum of n over all test cases does not exceed 2cdot 10^5 .
输出格式
For each test case, print a single line containing a single integer: the minimum inconvenience you can achieve by applying the given operation any (possibly zero) number of times.
输入输出样例
输入 #1
代码语言:javascript复制3
3
1 2 3
4
0 1 1 0
10
8 3 6 11 5 2 1 7 10 4
输出 #1
代码语言:javascript复制0
4
21
说明/提示
For the first test case, you can move a car from the 3 -rd sub-track to the 1 -st sub-track to obtain 0 inconvenience.
For the second test case, moving any car won't decrease the inconvenience of the track.
分析
要求数列和不变,对数列进行任意操作,求出数列中任意两个数差值的绝对值的和的最小值。我们自然可以想到尽可能地让数值均分,均分过后的数列一定只会有 1 种或 2 种数值,作差即可得到答案。
对于作差,我们也可以进行推导优化。假设均分过后的数列有 2 种数值,那么较大数值的个数为 sum_{i=1}^{n} a[i];bmod; n ,因为只存在 2 种数值,所以较大数值与较小数值作差的绝对值一定为 1,那么我们的答案就是较大数值的个数乘较小数值的个数即 [n;cdot;(sum_{i=1}^{n} a[i]);bmod; n]-[(sum_{i=1}^{n} a[i]);bmod; n]^2
代码
代码语言:javascript复制#include<bits/stdc .h>
#define int long long
using namespace std;
int t,n,a[200001];
int sum,op;
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
sum=0;
for(int i=1;i<=n;i ){
scanf("%lld",&a[i]);
sum =a[i];
}
op=sum%n;
printf("%lldn",(n-op)*op);
}
}
最后修改:2021 年 07 月 19 日 07 : 11 PM
© 允许规范转载