2014百度之星資格賽第三題
阿新 • • 發佈:2017-06-18
字符串 struct uri hit other printf 能夠 ava 單獨
Total Submission(s): 7837 Accepted Submission(s): 3350
Problem Description
Input
Output
Sample Input
Sample Output
這是一個對二叉樹進行建立和查找的題目。貪心算法。 建樹規則:將數轉化成32位二進制字符串,然後由高位到低位像建立字典樹一樣建樹。 查詢規則:將要查詢的數也轉化成32位二進制字符串。然後在樹中查找。假設不同邊有路,就走不同邊(保證當前位異或為1)否則走同樣邊。
以下是代碼:
Xor Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 7837 Accepted Submission(s): 3350
Problem Description
Zeus 和 Prometheus 做了一個遊戲。Prometheus 給 Zeus 一個集合,集合中包括了N個正整數。隨後 Prometheus 將向 Zeus 發起M次詢問。每次詢問中包括一個正整數 S 。之後 Zeus 須要在集合其中找出一個正整數 K ,使得 K 與 S 的異或結果最大。Prometheus 為了讓 Zeus 看到人類的偉大,隨即允許 Zeus 能夠向人類求助。
你能證明人類的智慧麽?
Input
輸入包括若幹組測試數據,每組測試數據包括若幹行。輸入的第一行是一個整數T(T < 10)。表示共同擁有T組數據。 每組數據的第一行輸入兩個正整數N。M(<1=N,M<=100000)。接下來一行。包括N個正整數,代表 Zeus 的獲得的集合。之後M行。每行一個正整數S。代表 Prometheus 詢問的正整數。
全部正整數均不超過2^32。
Output
對於每組數據,首先須要輸出單獨一行”Case #?:”,當中問號處應填入當前的數據組數,組數從1開始計算。 對於每一個詢問,輸出一個正整數K,使得K與S異或值最大。
Sample Input
2 3 2 3 4 5 1 5 4 1 4 6 5 6 3
Sample Output
Case #1: 4 3 Case #2: 4
這是一個對二叉樹進行建立和查找的題目。貪心算法。 建樹規則:將數轉化成32位二進制字符串,然後由高位到低位像建立字典樹一樣建樹。 查詢規則:將要查詢的數也轉化成32位二進制字符串。然後在樹中查找。假設不同邊有路,就走不同邊(保證當前位異或為1)否則走同樣邊。
由於是從高位到低位查找。保證查找到的數為和待查詢數異或值最大。
以下是代碼:
#include <stdio.h> #include <string.h> struct node { int l,r; __int64 num; } node1[1000000<<2]; int nodecnt; void addnum(__int64 temp) { int p=0; for(int i=31;i>=0;i--) { if(temp&(0x1<<i)) { if(node1[p].r!=NULL) { p=node1[p].r; } else { node1[p].r=nodecnt++; p=node1[p].r; } } else { if(node1[p].l!=NULL) { p=node1[p].l; } else { node1[p].l=nodecnt++; p=node1[p].l; } } } node1[p].num=temp; } __int64 check(__int64 temp) { int p=0; for(int i=31;i>=0;i--) { if(temp&(0x1<<i)) { if(node1[p].l==NULL) { p=node1[p].r; } else { p=node1[p].l; } } else { if(node1[p].r==NULL) { p=node1[p].l; } else { p=node1[p].r; } } } return node1[p].num; } int main() { int t; while(scanf("%d",&t)!=EOF) { int case1=1; while(t--) { int n,m; scanf("%d%d",&n,&m); __int64 temp; memset(node1,0,sizeof(node1)); nodecnt=1; for(int i=0; i<n; i++) { scanf("%I64d",&temp); addnum(temp); } printf("Case #%d:\n",case1++); for(int i=0; i<m; i++) { scanf("%I64d",&temp); printf("%I64d\n",check(temp)); } } } return 0; }
2014百度之星資格賽第三題