。。。看样例随便交了一发。。居然过了
给出n,k
让你用1到n^2,这些数形成一个n*n的矩阵,然后要求每一行的数是递增的,输出第k列的和最大的一种排列
分成2种情况, k=1 就按顺序排列即可
其余情况,为了让第k列的数尽可能大先把 1到k-1列都用 最小的数填满。也就是
每一行 按照1 2 3 ...的顺序填,遇到k-1列就换行
填完之后, 假设接下来我们在第一行第k列填下一个数 Ah,
要想在第二行第k列的数尽可能大,就必须把 第一行的第k+1列,k+2列...n列 ,都按顺序填上 Ah+1,Ah+2...
也就是,第k到 n列。还是按照刚才的方法。每一样按照 小到大的顺序填。遇到第n列就换行。
就这么构造。。。就可以了
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const __int64 inf=2147483647;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 min(__int64 a,__int64 b)
{return a<b?a:b;}
__int64 max(__int64 a,__int64 b)
{
return a<b?b:a;
}
int n,k;
int tm[505][505];
int main( )
{
cin>>n>>k;
int i ,j;
int sum=0;
if (k==1)
{
int ok=1;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
tm[i][j]=ok++;
}
}
for (i=1;i<=n;i++)
sum+=tm[i][k];
}
else
{
int ok=1;
for (i=1;i<=n;i++)
{
for (j=1;j<k;j++)
{
tm[i][j]=ok++;
}
}
for (i=1;i<=n;i++)
{
for (j=k;j<=n;j++)
{
tm[i][j]=ok++;
}
}
for (i=1;i<=n;i++)
sum+=tm[i][k];
}
printf("%d\n",sum);
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
if (j!=1) printf(" ");
printf("%d",tm[i][j]);
}
printf("\n");
}
return 0;
}