做两种标记,一个是需要改变为完全平方数的need[]数组,一个是不需要改变为完全平方数的noneed[]数组。并记录已经是完全平方数的个数bal。
数据处理:将不予考虑的数字设置为MAX,这样排序的时候就自动排到最后面去不再干扰取数字。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int need[200005],noneed[200005];
int main(){
long long n,num,t,bal=0,s=0;scanf("%I64d",&n);
for(int i=0;i<n;i++){
scanf("%I64d",&num);
t=sqrt(num)+0.00001;
if(t*t==num){bal++;
need[i]=2e9;
noneed[i]=(num==0)?2:1;
}
else {
need[i]=min(num-t*t,(t+1)*(t+1)-num);
noneed[i]=2e9;
}
}
if(n/2>bal){sort(need,need+n);
for(int i=0;i<n/2-bal;i++)s+=need[i];
}else
if(n/2<bal){sort(noneed,noneed+n);
for(int i=0;i<bal-n/2;i++)s+=noneed[i];
}
printf("%I64d",s);
}