[其他] 特殊排序(breadsorting)的理解與一般化
這是題目的網址:https://open.kattis.com/problems/bread
這題目的重點如下:
- 三個相鄰的數字可以做旋轉,例如3,5,4 -> 4,3,5 -> 5,4,3
- 大小為n的array裡面有n個相異的整數,其值為1,2,3,...,n
- 給你一個起始的數列與最終的數列,回答可否藉由旋轉來完成轉換
EX1:
n: 4
起始:1 3 4 2
最終:4 3 2 1
1 3 4 2
->4 1 3 2
->4 2 1 3
->4 3 2 1 (Possible)
我在網路上搜尋到的解法是,對於 1 2 3 4這個數列,起始與最終轉換到1 2 3 4
是否滿足某個性質:
對起始與最終數列,分別加總小於目前數值的個數,
其相差如果是偶數則是 possible
(如解釋不清楚,可以參照我下面的程式碼)
我對這演算法正確性的理解是
- 相異的數,所以兩個數的關係不是小於就是大於
- 計算小於的個數等同於計算大於的個數
- 旋轉的關係會導致小於個數的變化
- 當3個相鄰的數時,我們只要確定相差是2的倍數即可保證可轉換
- 一般化來講,當k個相鄰的數時,是否要相差k-1的倍數才可保證能轉換?
+ 我是計算關係個數改變來做以上推斷
我比較沒有信心的部分是這種存在性,看似好像合理但我又不是很確定是否真的有
一系列的步驟可以完成這樣的轉換。也就是存在反例來打我臉XD
這邊不知道有沒有人可以理解我的擔憂?
我覺得好像還差一個步驟來完成這個一般化證明
先謝謝了
code:
int count(vector<int> &arr, int idx, int n){
int cnt=0;
for(int i=idx+1;i<n;++i)
if(arr[i]<arr[idx])
++cnt;
return cnt;
}
int main(){
int n;
cin >> n;
vector<int> org(n);
vector<int> target(n);
for(int i=0;i<n;++i) cin >> org[i];
for(int i=0;i<n;++i) cin >> target[i];
int res1=0,res2=0;
for(int i=0;i<n;++i){
res1 += count(org,i,n);
res2 += count(target,i,n);
}
if(abs(res1-res2)%2==0)
cout << "Possible" << endl;
else
cout << "Impossible" << endl;
return 0;
}
--
天下英雄出我輩,一入江湖歲月催。
鴻圖霸業談笑間,不勝人生一場醉。
提劍跨騎揮鬼雨,白骨如山鳥驚飛。
塵世如潮人如水,只嘆江湖幾人回。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 98.207.101.195 (美國)
※ 文章網址: https://www.ptt.cc/bbs/Math/M.1600823286.A.845.html
推
09/23 09:26,
5年前
, 1F
09/23 09:26, 1F
→
09/23 09:31,
5年前
, 2F
09/23 09:31, 2F
→
09/23 09:43,
5年前
, 3F
09/23 09:43, 3F
→
09/23 09:45,
5年前
, 4F
09/23 09:45, 4F
→
09/23 09:47,
5年前
, 5F
09/23 09:47, 5F
→
09/23 09:48,
5年前
, 6F
09/23 09:48, 6F
→
09/23 10:24,
5年前
, 7F
09/23 10:24, 7F
→
09/23 10:48,
5年前
, 8F
09/23 10:48, 8F
→
09/23 10:52,
5年前
, 9F
09/23 10:52, 9F
→
09/23 10:59,
5年前
, 10F
09/23 10:59, 10F
→
09/23 11:03,
5年前
, 11F
09/23 11:03, 11F
→
09/23 11:04,
5年前
, 12F
09/23 11:04, 12F
→
09/23 11:07,
5年前
, 13F
09/23 11:07, 13F
→
09/23 11:07,
5年前
, 14F
09/23 11:07, 14F
→
09/23 11:37,
5年前
, 15F
09/23 11:37, 15F
推
09/23 14:06,
5年前
, 16F
09/23 14:06, 16F
→
09/23 14:07,
5年前
, 17F
09/23 14:07, 17F
→
09/23 14:09,
5年前
, 18F
09/23 14:09, 18F
→
09/23 14:19,
5年前
, 19F
09/23 14:19, 19F
→
09/23 14:36,
5年前
, 20F
09/23 14:36, 20F
→
09/23 14:37,
5年前
, 21F
09/23 14:37, 21F
→
09/23 14:45,
5年前
, 22F
09/23 14:45, 22F
→
09/23 14:55,
5年前
, 23F
09/23 14:55, 23F
→
09/23 14:56,
5年前
, 24F
09/23 14:56, 24F
→
09/23 15:03,
5年前
, 25F
09/23 15:03, 25F
→
09/23 15:04,
5年前
, 26F
09/23 15:04, 26F
→
09/23 15:06,
5年前
, 27F
09/23 15:06, 27F
→
09/24 01:19,
5年前
, 28F
09/24 01:19, 28F
→
09/24 01:19,
5年前
, 29F
09/24 01:19, 29F
討論串 (同標題文章)