最后一个测试点超时
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int main() {
int N;
cin >> N;
int a[10001];
int b[101][101] = {0};
for(int i = 0; i < N; i++) {
cin >> a[i];
}
sort(a, a + N, cmp);
int m, n;
int min = 100001;
for(int i = 1; i <= sqrt(N); i++) {
if(N % i == 0) {
int j = N / i;
if(min > j - i) {
m = j;
n = i;
min = m - n;
}
}
}
int k = 0;
int i = 0, j = 0;
b[i][j] = a[k++];
while(k < N) {
while(j < n - 1 && b[i][j + 1] == 0) {
b[i][++j] = a[k++];
}
while(i < m - 1 && b[i + 1][j] == 0) {
b[++i][j] = a[k++];
}
while(j - 1 >= 0 && b[i][j - 1] == 0) {
b[i][--j] = a[k++];
}
while(i - 1 >= 0 && b[i - 1][j] == 0) {
b[--i][j] = a[k++];
}
}
for (int i = 0; i < m; i++) {
cout << b[i][0];
for (int j = 1; j < n; j++) {
cout << " " << b[i][j];
}
cout << endl;
}
return 0;
}