#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int a[51], sum, T;
int p(int w){ //i是当前要放的求的编号
for(int i = 1; i <= T; i++){ //逐一判断能不能放
int tem_sum = a[i] + w;
int gen = (int)sqrt(tem_sum) * (int)sqrt(tem_sum);
if(tem_sum == gen || a[i] == 0){
a[i] = w;
sum++;
p(w + 1);
return 1;
}
}
return 0;
}
int main(){
int iCase;
cin>>iCase;
while(iCase--){
cin>>T;
sum = 0;
memset(a, 0, sizeof(a)); //a数组存储最上面的球的大小
if(p(1))
cout<<sum<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
更快的就是1. 公式 f(n) = n*n/2+n-0.5向下取整
2. 规律 f(n) = f(n - 1) + (n + 1) / 2 + (n + 1) / 2 (n > 2), 由于这个程序较为简单,这里不提供