题解 P5823 【【L&K R-03】课表的排列】
Stephen_Curry · · 题解
时间凑不上,比赛没能打成,发个题解来弥补一下……
第一眼看到样例,突然产生一种瞎猜的想法:是否只要先输出
算了一下,发现这种乱搞解法在于是尝试提交一下居然还真过了?
不管怎么凑巧,不管窝运气到底怎么爆棚,这种方法必须要经过证明才可以算得上正解。
于是便有了这篇题解。
证明过程:
啊啊啊一开始把
咱们先设当前计算的为第
这时的
1. 奇数
图纯手画真的很丑
显然两个
这里要注意坑点:间隔数比两数差少
化简后得
显然易发现,
2. 偶数
接着上面的无敌丑图继续画,即可得到偶数的间隔:
化简后得
显然结果与奇数一样,在
既然奇偶数都为等差数列,咱们就可以看这两个等差数列是否能拼成一个等差数列了。
奇数的间隔数列最小到
证明完毕。
有了这个证明,我们即可得出程序:
#include <bits/stdc++.h>
#define rp cout << i << " "; //懒
using namespace std;
int n;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) rp //输出全数列
for (int i = 1; i <= n; i += 2) rp //输出奇数
for (int i = 2; i < n; i += 2) rp //输出偶数
return 0; //完结撒花~
}