1. 程式人生 > 實用技巧 >P5823 【L&K R-03】課表的排列 題解

P5823 【L&K R-03】課表的排列 題解

本文純找規律,想要數學證明請勿進入

題目分析

首先題目重點是這句話:

如果課表上一共有 n 個科目,每個科目都有且僅有兩節課,小 L 想知道是否存在一個課表,滿足這 n 科的兩節課間隔的課程數從小到大排序後是一個公差為 1 的等差數列。

換句話說,這句話意思是:

如果給你 2n 個數,分別是 1,1,2,2,…,…,n,n 。對於任意小於等於 n 的數字 k ,將其兩次出現的位置記做 i 、j 。\(S_k\) \(=j-i+1\) 。要求找到一種排列 2n 個數的方法使得將\(S\)排序後是一個公差為 1 的等差數列。

解決題目

DFS

爆搜大家都會跟列舉全排列差不多,但是 n=100000x+1 這種資料爆搜是不行的,DFS期望得分 \(50-\)

,錯了別怪我,我沒交。

規律?

用DFS跑 \(n=3\) 之後輸出所有結果,如果沒錯的話,應該有如下的兩個可行解:

1 2 3 1 3 2
1 2 3 2 1 3

—— 有什麼規律嗎?
—— 都是以1 2 3開頭。
—— 還有嗎?
—— 沒了……
—— 把開頭的1 2 3去掉,看後面的三個數!
—— 呃……1 3總是在一起,順序也不變。

\(n=5\)
1 2 3 4 5開頭的可行結果:

1 2 3 4 5 1 3 5 2 4 
1 2 3 4 5 1 4 2 5 3 
1 2 3 4 5 2 1 5 4 3 
1 2 3 4 5 2 4 1 3 5 
1 2 3 4 5 3 1 4 2 5 
1 2 3 4 5 3 2 1 5 4 

其中有

1 2 3 4 5 1 3 5 2 4 
1 2 3 4 5 2 4 1 3 5 

滿足之前推出來的規律。

等等,為什麼是 \(n=5\) 而非 \(n=4\) 呢?

看題,題目中有

輸入僅一行,一個 奇數 n,表示課表上的課程數。

所以看題很重要!

規律推廣

用DFS可以跑出 \(n=7\)\(n=9\) 以及 \(n=11\) 可以發現如下規律:

前 n 個數是1,2,…,n。後 n 個數可以是(小於 n 的所有偶數+小於 n 的所有奇數)或(小於 n 的所有奇數+小於 n 的所有偶數)。所有奇偶數均按從小到大排列。

分塊

分塊就是再DFS可以接受的範圍搜尋,出了這個範圍就用別的方法,例如上面的規律。

這是考場上常用的技巧,可以保證自己再拿到暴力分的基礎上可能有更高的分。

總結

數學不好不要慌,暴力規律出奇跡!