题意:给出一堆数,求出其子集,使平方和的平均值最小
思路:如果按照绝对值从小到大排序,可以证明如果多加一个元素,会使平均值增大,随意最小的比值就是第一个元素的平方。
坑:有负数,要对负数取绝对值。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
template<class T>
inline bool read(T &n)
{
T signal = 1, x = 0;
char ch = getchar();
while((ch < '0' || ch >'9') && ch != EOF && ch != '-')
ch = getchar();
if(ch == EOF)
return false;
if(ch == '-')
signal = -1, ch = getchar();
while(ch >= '0' && ch <= '9'){
x *= 10;
x += ch - '0';
ch = getchar();
}
n = signal * x;
return true;
}
const int MAX = 101000;
long long a[MAX];
int main(void)
{
int n;
while(read(n)){
for(int i = 0 ; i < n ; ++i)
read(a[i]),a[i] = abs(a[i]);
sort(a,a+n);
printf("%lld\n",a[0] * a[0]);
}
return 0;
}