第一遍自己写得了21分,第二第四个点没过
注意是要在内循环时加上key<=nn-1判断,防止重复赋值
学习:
题目里对m n 的要求是,m*n等于N,并且m n的差值最小(并不是小于矩阵中的值)
这里学习到了如何求m n ,差最小就从平方根开始,然后发现可以整除,就赋值即可
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <unordered_map>
#include <cstring>
using namespace std;
bool cmp(int a, int b){
return a>b;
}
int nn;
int m,n;
vector<int> ans;
int main(){
cin >> nn;
for(int i=0; i<nn; i++){
int a;
cin >> a;
ans.push_back(a);
}
sort(ans.begin(),ans.end(),cmp);
for(int i=sqrt(nn);i>=1;i--){
if(nn%i==0){
n = i;
m = nn/i;
break;
}
}
int fin[m][n];
int key = 0;
for(int i=0; i<m/2+m%2;i++){
for(int j=i; j<n-i&&key<=nn-1; j++){
fin[i][j] = ans[key];
key++;
}
for(int j=i+1; j<m-i&&key<=nn-1; j++){
fin[j][n-i-1] = ans[key];
key++;
}
for(int j=n-i-2; j>=i&&key<=nn-1; j--){
fin[m-i-1][j] = ans[key];
key++;
}
for(int j=m-i-2; j>=i+1&&key<=nn-1; j--){
fin[j][i] = ans[key];
key++;
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(j==0) cout << fin[i][j];
else cout << " " << fin[i][j];
}
cout << endl;
}
return 0;
}