将使用while循环计算m, n的值改为使用for循环计算m,n的值(见注释),即存在大量计算时,for循环的效率比while高
正确代码
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
bool cmp(const int& a, const int& b) {return a > b;}
int N, m, n, level, cnt=0;
int main() {
scanf("%d", &N);
vector<int> v(N);
for(int i = 0; i < N; i++) scanf("%d", &v[i]);
sort(v.begin(), v.end(), cmp);
// n = sqrt(N);
// m = N / n;
// while(m * n != N) {
// m = m + 1;
// n = N - m;
// }
for(n = sqrt(N); n >= 1;n--) {
m = N / n;
if(m * n == N) break;
}
vector<vector<int>> s(m, vector<int>(n));
level = m / 2 + m % 2;
for(int i = 0; i < level; i++) {
for(int j = i; j < n - i && cnt <= N - 1; j++)
s[i][j] = v[cnt++];
for(int j = 1 + i; j < m - 1 - i && cnt <= N - 1; j++)
s[j][n - 1 - i] = v[cnt++];
for(int j = n - 1-i;j >= i && cnt <= N - 1; j--)
s[m - 1 - i][j] = v[cnt++];
for(int j = m - 2 - i; j >= i +1 && cnt <= N - 1;j--)
s[j][i] = v[cnt++];
}
for(int i = 0;i<m;i++) {
if(i) printf("\n");
for(int j = 0;j<n;j++) {
if(j) printf(" ");
printf("%d", s[i][j]);
}
}
return 0;
}