最后一个测试点超时
#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; }