题目描述:
给你n个数a[1], a[2], a[3], a[4]……a[n],需要你计算出
的最小值,其中x为任意整数。
输入:
输入包含若干个测试样例。第一行只有一个数为测试样例的个数T(1<=T<=10)。
对于每一个测试样例,第一行有一个数为数组的元素个数n,第二行有n个整数a[1], a[2], a[3]……a[n]
。
输出:
样例输入:
1
5
1 1 1 2 3
输出:
4
解题思路:
一道比较简单的题,直接拆开所求公式推导,
其中n,且n>0,a[i]^2的和,2*a[i]的和都为已知数,x是唯一未知数,故该题化简为开口向上的抛物线求对称轴处最小值,求对称轴的过程中可能取到小数,故用浮点数。
需要注意的是这道题的答案应取整数,故需要对对称轴的值进行四舍五入处理,找到较为接近对称轴的整数,并代入上面推导公式求得结果。
AC代码:
#include <iostream>
#include <stdio.h>
#include <queue>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stdlib.h>
#include <string>
#include <vector>
typedef long long ll;
typedef double db;
#include <list>
#include <stack>
#include <cstring>
#include <cmath>
using namespace std;
const int N =2010;
char dadi,str[1000],str2[1000];
int main()
{
ll n,t,a[100005],ans,sum,i,cuna,j,man,k;
db cun;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
sum=0;
man=0;
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
man+=a[i]*a[i];
}
cun=sum*1.0/n;
cuna=cun;
if(cuna!=cun)
{
if(cuna<cun)
{
if(cun-cuna>=0.5)
{
cuna++;
}
}
else if(cuna>cun)
{
if(cuna-cun>=0.5)
{
cuna--;
}
}
}
ans=n*cuna*cuna-2*sum*cuna+man;
printf("%lld\n",ans);
}
return 0;
}