C. K-special Tables
time limit per test
memory limit per test
input
output
People do many crazy things to stand out in a crowd. Some of them dance, some learn by heart rules of Russian language, some try to become an outstanding competitive programmers, while others collect funny math objects.
k-special tables. In case you forget, the table n × n is called k-special if the following three conditions are satisfied:
- 1 to n2
- in each row numbers are situated in increasing order;
- k-th column is maximum possible.
k-special table of size n × n. Both rows and columns are numbered from 1 to n, with rows numbered from top to bottom and columns numbered from left to right.
Input
n and k (1 ≤ n ≤ 500, 1 ≤ k ≤ n) — the size of the table Alice is looking for and the column that should have maximum possible sum.
Output
k-th column of the required table.
n lines should contain the description of the table itself: first line should contains n elements of the first row, second line should contain n
If there are multiple suitable table, you are allowed to print any.
Sample test(s)
input
4 1
output
28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
input
5 3
output
85 5 6 17 18 19 9 10 23 24 25 7 8 20 21 22 3 4 14 15 16 1 2 11 12 13
把1-n*n填入n*n的表格中,使得每一行都是递增的,并且使得第K列尽量的大!
分析:
其实这个题不用多想,直接看样例看出规律来!
第K列往后都是从最大n*n递减着来填入,比如说n=5时,
那么第k列及往后是
23 24 25
20 21 22
17 18 19
14 15 16
11 12 13
K列往前是:
9 10
7 8
5 6
3 4
1 2
这样依次填入即可:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500 + 10;
int a[maxn][maxn];
int main()
{
int n,k;
cin >> n >> k;
int cnt = n * n;
int sum = 0;
for (int i = 1; i <= n; ++i){
for (int j = n; j >= k; --j)
a[i][j] += cnt--;
sum += cnt+1;
}
for (int i = 1; i <= n; ++i)
for (int j = k-1; j >= 1; --j)
a[i][j] = cnt--;
cout << sum << endl;
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= n; ++j){
if (j > 1)cout << " " ;
cout << a[i][j];
}
cout << endl;
}
return 0;
}