2021年给我一个网站,做图标去什么网站找,外包一个企业网站多少钱,网站开发虚拟主机管理系统简要题意
棋盘上有 n n n 行#xff0c;第 i i i 行有 i i i 个格子。你要在格子填 1 ∼ n 1\sim n 1∼n#xff0c;满足#xff1a;
每行第一个数互不相同所有在行上相邻的两个数所组成的无序对互不相同每行的数互不相同 n ≤ 4000 n\le4000 n≤4000
题解
容易发现…简要题意
棋盘上有 n n n 行第 i i i 行有 i i i 个格子。你要在格子填 1 ∼ n 1\sim n 1∼n满足
每行第一个数互不相同所有在行上相邻的两个数所组成的无序对互不相同每行的数互不相同 n ≤ 4000 n\le4000 n≤4000
题解
容易发现棋盘上的无序对与总的无序对数量是相同的也就是说要全部填满。可以考虑把它们分类然后再按规律放数。
我们发现无序对中两数差为 1 1 1 有 n − 1 n-1 n−1 个差为 2 2 2 有 n − 2 n-2 n−2 个 … \dots …差为 n − 1 n-1 n−1 有 1 1 1 个看上去很巧如果能把它们按行归类就好了。但是显然 2 , 5 , 3 , 6 , … 2,5,3,6,\dots 2,5,3,6,… 是放不进的。
考虑能否这样第 i i i 行有差为 1 ∼ i − 1 1\sim i-1 1∼i−1 的无序对各 1 1 1 个。发现如果这样构造 x , x 1 , x − 1 , x 2 , x 2 , … x,x1,x-1,x2,x_2,\dots x,x1,x−1,x2,x2,…是符合条件的。于是就做完了。
#includebits/stdc.h
using namespace std;
int n,t;
vectorint v[4001];
bool cmp(vectorint v1,vectorint v2)
{return v1.size()v2.size();
}
int main()
{cinnt;for(int i1;in;i){int x0,nowi,y1;while(now0nown){v[i].push_back(now);nownow(x1?1:-1)*y;y;x;}}sort(v1,v1n,cmp);for(int i1;in;i){for(auto j:v[i]){printf(%d ,j);}puts();}
}