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