https://cn.vjudge.net/contest/165541#problem/H
开始知道是构造。但是因为没有写过构造题就没有办法了。
代码超级短。但是网上的数学证明就很长很长。。
附赠连接。。。http://blog.csdn.net/spark_007/article/details/9017533
经过数学证明:
最大的那一行排列一定是 m,m,m-1m-1,m-2,m-2……
并且n一定是大于3的奇数。
如果比赛中遇到了,就大胆的写吧。。
给定n组 1-m个数。
构成m*n矩阵,每一列包含 1 2 3 …m,
并且每一行相邻的差不得大于1。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main () {
int m, n;
while (scanf("%d%d", &m, &n) == 2) {
int sum=0;
for(int i=1;i<=n-1;i+=2)
{ sum+=m*2;
m--;
}
sum+=m;
cout<<sum<<endl;
}
return 0;
}