河南省第一屆程式設計競賽

2021-07-01 19:18:21 字數 1340 閱讀 7956

【試題三】

密碼破譯 

某組織欲破獲乙個外星人的密碼,密碼由一定長度的字串組成。此組織擁有一些破譯此密碼的長度不同的鑰匙,若兩個鑰匙的長度之和恰好為此密碼的長度,則此密碼被成功破譯。現在就請你程式設計找出能破譯此密碼的兩個鑰匙。 

【標準輸入】

第一行:nn

為鑰匙的個數(1<=n<=1000) 

第二行: l                  l

為密碼的長度  以下

有n行: ai                每一行是一把

鑰匙的長度

i=1,2,

……,n 【

標準輸出】

若無法找到破譯此密碼的鑰匙,則輸出0

若找到兩把破譯的鑰匙,則輸出檔案有兩行,分別為兩把鑰匙的編號,按從小到大輸出。若有多種破譯方案,則只輸出包含

起始編號最小的一組即可。 [

【約束條件】

(1)1<=n,l

,ai 

<=1000

(  i=1, 2, 

….., n ) (2

)時間限制: 

1000ms 【 

樣  例】

標準輸入

標準輸出

10 80 

27 9  4 

73 23 

68 12 

64 92 

16 6 7

型別:組合;分治

解法:對所有可能的鑰匙組合進行窮舉是個方法,但應該注意到:要求兩個鑰匙的長度之和恰好為此密碼的長度,那麼其中一把鑰匙的長度必定大於等於密碼長度的一半。先對鑰匙進行公升序排序,然後使用二分搜尋法定位到第乙個大於l/2(l為密碼的長度)的元素位置,得到相鄰兩鑰匙的長度之和

and,如果

and大於

l則向左端搜尋,否則向右端搜尋,遇到

and==l

,儲存兩把破譯的鑰匙的編號。搜尋完畢還沒有相符的

and,則無法找到破譯此密碼的鑰匙。最後,如果相符的

and只有乙個,則直接輸出;如果相符的

and有多個,則選擇起始編號最小的一組資料輸出。

#include

#include

#define max_n 1010

using namespace std;

int m,n;

int b[max_n];

struct nodea[max_n];

bool cmp(node a,node b)

np=nq=1001;

int p=ny-1,q=ny;

while(p>=1&&q<=n)

return 0;

}

河南省第一屆ACM省賽試題 密碼破譯

某組織欲破獲乙個外星人的密碼,密碼由一定長度的字串組成。此組織擁有一些破譯此密碼的長度不同的鑰匙,若兩個鑰匙的長度之和恰好為此密碼的長度,則此密碼被成功破譯。現在就請你程式設計找出能破譯此密碼的兩個鑰匙。第一行 n n為鑰匙的個數 1 n 1000 第二行 l l為密碼的長度 以下有n行 ai 每一...

第一屆河南省大學生程式設計競賽題型簡要分析

概覽 題數 型別幾何 圖論組合 分治 多重揹包 模擬 貪心深度優先搜尋 剪枝 拓撲排序 有向圖 試題一 練習處 型別 幾何 解法 每個物資在每個圓形區域的有效性可以轉化為數學公式 是圓心座標,r是半徑,x y是落點座標 然後就是利用雙層迴圈,在每個圓中探測每個投放物資的座標點,有效則輸出 yes 無...

第三屆河南省程式設計競賽

include include include include includeusing namespace std const int maxn 11000 int main a for int i n i b if ab printf d n num2 else printf d n num1 ...