程式設計開發火柴排隊方法

2022-09-23 10:33:10 字數 1513 閱讀 3278

程式設計開發火柴排隊方法。

qaq昨天隊內胡策的t1,成功打次了

沒做過火柴排隊的我考完試先跑過來做這道題了

首先,對於兩個序列,要使他們之間的距離最小,也就是σ(ai+bi)^2最小,肯定是最大的和最大的對應,次大的和次大的對應,也就是說,把兩個序列排序後,各個位上一一對應。但是還要保證交換次數最少,所以不能打亂順序。

舉個栗子:

a序列:4 7 2 1

b序列:3 2 1 4

排序後:

a:1 2 4 7

b:1 2 3 4

所以我們得到1,1對應,2,2對應,4,3對應,7,4對應,所得距離最小

對於原序列,我們把每個數字排序後的序號標記在對應的原位置上

也就是:

a:3 4 2 1

b:3 2 1 4

現在問題轉化為,如何交換b序列中的相鄰數字,使用最少的步數來使b變為a

現在,我用c陣列表示,如果要使b交換後和a相同,各個數字應該放在哪個位置上

c:1 3 4 2

(當然,c陣列的統計,還要用乙個類似於模擬map函式的陣列實現)

也就是說交換完成後的b序列,對應的c應該是1 2 3 4的嚴格遞增1的序列

所以我們要用最少的交換次數,來使c變為乙個嚴格上公升的序列,如何求最少交換次數?

求逆序對個數

證明:對於乙個嚴格遞增的序列,一定不存在逆序對。對於乙個非嚴格遞增的序列,一定存在相鄰的數字為一對逆序對,所以,我們的最小交換次數就是逆序對的個數。

我用的歸併排序,之前有歸併排序求逆序對的部落格

ps:陣列模擬map求c陣列的時候有點暈,一定要仔細想想

**:#include

#include

#include

#include

using namespace std;

const int maxn=100000+10,mo=99999997;

int n,ans;

int c[maxn],fin[maxn],m[maxn];

struct hh

a[maxn],b[maxn];

bool cmp(hh x,hh y)

else

}while(i<=mid) m[++k]=c[i++];

while(j<=r) m[++k]=c[j++];

for(int t=l;t<=r;++t)

c[t]=m[t-l+1];

}void done(int l,int r)

}int main()

for(int i=1;i<=n;++i)

sort(a+1,a+n+1,cmp);

sort(b+1,b+n+1,cmp);

for(int i=1;i<=n;++i) fin[i]=a[i].num;

for(int i=1;i<=n;++i) c[b[i].num]=fin[i];

done(1,n);

printf("%d",ans%mo);

return 0;

}

程式設計開發舊鍵盤打字實現方法

舊鍵盤上壞了幾個鍵,於是在敲一段文字的時候,對應的字元就不會出現。現在給出應該輸入的一段文字 以及壞掉的那些鍵,打出的結果文字會是怎樣?輸入格式 輸入在2行中分別給出壞掉的那些鍵 以及應該輸入的文字。其中對應英文本母的壞鍵以大寫給出 每段文字是不超過105個字元的串。可用的字元包括字母 a z,a ...

建立繼承和方法重寫「程式設計開發」

package d class person 7 12行 定義方法getinfo 獲取個人資訊 void showinfo 13 18行 定義方法showinfo 顯示個人資訊 public class student extends person 25 28行 定義方法setinfo 獲取學生的資...

學Python程式設計開發怎樣 封裝的實現方法是什麼

在python中,封裝 是指將抽象得到的資料和行為 或功能 相結合,形成乙個有機的整體 即類 封裝的目的是增強安全性和簡化程式設計,使用者不必了解具體的實現細節,而只是要通過外部介面,以特定的訪問許可權來使用類的成員。封裝原則有兩個 1 將不需要對外提供的內容都隱藏起來 2 把屬性都隱藏,提供公共方...