1.N 找出m-n的最大m,n
开平方后的数往上或下找能被整除的
2.找规律(循环)
本质:把一个递减的数组重新排序,没有时间复杂度的要求可以放到一个新的数组中
顺时针完成一次循环(见下图 黑框和灰框各为一次循环),
其中一行(i相同),一列(j相同)
一次循环可分为四个小的步骤(见图中四个箭头)。
如果图不是很好理解,可以以绿色箭头圈中的数字为一组。写出他们的i j(行列号),观察i j的变化
发现 i j 一个固定一个变化,变化的范围与行数列数 i有关。
外层循环无法轻易改变当前值,考虑改变当前循环的初值
如果以上步骤完成之后,还不是很明白,或者我的表述有错误,请留言给我。或者百度 liuchuo 找寻这道题的代码 看一下。
一下是C++代码
#include <iostream>
#include <algorithm>
#include <vector>
#include<cmath>
using namespace std;
int cmp(int a,int b){
return a>b;
}
int main(){
int N,n,m,t=0;
cin>>N;
for(n=sqrt((double)N);n>=1;n--){
if(N%n==0){
m=N/n;
break;
}
}
vector<int> a(N);
for(int i=0;i<N;i++)
scanf("%d",&a[i]);
sort(a.begin(),a.end(),cmp);
int b[m][n];/