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

2021-08-18 17:46:49 字數 1126 閱讀 5427

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

第一行: n n為鑰匙的個數(1<=n<=1000)

第二行: l l為密碼的長度

以下有n行: ai 每一行是一把鑰匙的長度 i=1,2,……,n

【約束條件】

1<= n,l,ai <=1000    (  i=1, 2, ….., n )
若無法找到破譯此密碼的鑰匙,則輸出0

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

1080279

4732368

1264

921667

因為這裡的n的值是在1000以內的,所以可以暴力解決的,複雜度o(n^2), 1s內是可以解決的。然後我回頭看了一下大佬的部落格就是使用的分治法,複雜度降低到o(n*logn)。

下面講一下用分治法怎麼寫的,就是先對資料進行排序,然後找到第乙個大於等於l一半的數字,因為兩把鑰匙組合要達到密碼的長度,所以其中一把必定要大於密碼長度的一半,然後衝這個點開始向兩邊進行查詢,如果比密碼長度要大,p就向左挪一位,如果小的話就需要q向右挪一位,相等的話就需要判斷是否需要更新了。

#include #include #include #define n 5050

using namespace std;

struct nodee[n];

int cmp(node a,node b)

} minp=minq=5001; //初始序號都定位最大

p=j-1;

q=j;

while(p>=0&&ql)

p--;

else if(e[p].val+e[q].val=5001)

printf("0\n");

if(minpprintf("%d\n%d\n",minp,minq);

else

printf("%d\n%d\n",minq,minp);

} return 0;

}

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

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

第九屆河南省ACM省賽 D 飛彈發射

alpha 機構研發出一種新型智慧型飛彈,它能夠在雷達檢測到的區域內,選擇一條前進的路徑,擊破路徑上所有的目標物。雷達位於 0,0 處,它能夠檢測到兩條射線之間的區域 不妨設在第一象限 飛彈一開始置放在 0,0 處,它可以在雷達能檢測到的區域內先選擇乙個目標物擊破,然後 再繼續前進,選擇另乙個目標物...

整理第十屆河南省ACM省賽正解

問題a 諜報分析 題目鏈結 正解 include include include include includeusing namespace std struct word word 1000 int n 0 int comp word w1,word w2 int main for it m.b...