超級密碼(BFS)
阿新 • • 發佈:2018-07-29
fst list 開始 提示 密碼 fstream 歷史 pop esc
密碼是一個C進制的數,並且只能由給定的M個數字構成,同時密碼是一個給定十進制整數N(0<=N<=5000)的正整數倍(如果存在多個滿足條件的數,那麽最小的那個就是密碼),如果這樣的密碼存在,那麽當你輸入它以後門將打開,如果不存在這樣的密碼......那就把門炸了吧.
註意:由於寶藏的歷史久遠,當時的系統最多只能保存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.
輸入數據的第一行是一個整數T(1<=T<=300),表示測試數據的數量.每組測試數據的第一行是兩個整數N(0<=N<=5000)和C(2<=C<=16),其中N表示的是題目描述中的給定十進制整數,C是密碼的進制數.測試數據的第二行是一個整數M(1<=M<=16),它表示構成密碼的數字的數量,然後是M個數字用來表示構成密碼的數字.兩個測試數據之間會有一個空行隔開.
註意:在給出的M個數字中,如果存在超過10的數,我們約定用A來表示10,B來表示11,C來表示12,D來表示13,E來表示14,F來表示15.我保證輸入數據都是合法的.
對於每組測試數據,如果存在要求的密碼,則輸出該密碼,如果密碼不存在,則輸出"give me the bomb please".
註意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用一個整型變量來保存密碼;我保證密碼最高位不為0(除非密碼本身就是0).
Problem Description
Ignatius花了一個星期的時間終於找到了傳說中的寶藏,寶藏被放在一個房間裏,房間的門用密碼鎖起來了,在門旁邊的墻上有一些關於密碼的提示信息:密碼是一個C進制的數,並且只能由給定的M個數字構成,同時密碼是一個給定十進制整數N(0<=N<=5000)的正整數倍(如果存在多個滿足條件的數,那麽最小的那個就是密碼),如果這樣的密碼存在,那麽當你輸入它以後門將打開,如果不存在這樣的密碼......那就把門炸了吧.
註意:由於寶藏的歷史久遠,當時的系統最多只能保存500位密碼.因此如果得到的密碼長度大於500也不能用來開啟房門,這種情況也被認為密碼不存在.
Input
註意:在給出的M個數字中,如果存在超過10的數,我們約定用A來表示10,B來表示11,C來表示12,D來表示13,E來表示14,F來表示15.我保證輸入數據都是合法的.
Output
註意:構成密碼的數字不一定全部都要用上;密碼有可能非常長,不要試圖用一個整型變量來保存密碼;我保證密碼最高位不為0(除非密碼本身就是0).
SampleInput
3 22 10 3 7 0 1 2 10 1 1 25 16 3 A B C
SampleOutput
110 give me the bomb please CCB
kuangbin搜索好像有個類似的題目,也是找只能由幾個數構成某個數的倍數,不同的是那個題只能有01構成而且有SPJ,這道題是輸入且輸出字典序最小的。
做題歷程=7=,最開始思路錯了去從n的倍數開始搜TLE,然後正確的思路沒有判斷取模時0的情況RE,再然後沒有把char換成intWA,=7=簡直了
思路就是從給定的幾個數開始搜索,然後每次加上那幾個數,取模判重一下就行了。
值得註意的是因為涉及到進制,一定要註意字母和數字之間的轉換。
代碼:
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <sstream> 6 #include <iomanip> 7 #include <map> 8 #include <stack> 9 #include <deque> 10 #include <queue> 11 #include <vector> 12 #include <set> 13 #include <list> 14 #include <cstring> 15 #include <cctype> 16 #include <algorithm> 17 #include <iterator> 18 #include <cmath> 19 #include <bitset> 20 #include <ctime> 21 #include <fstream> 22 #include <limits.h> 23 #include <numeric> 24 25 using namespace std; 26 27 #define F first 28 #define S second 29 #define mian main 30 #define ture true 31 32 #define MAXN 1000000+5 33 #define MOD 1000000007 34 #define PI (acos(-1.0)) 35 #define EPS 1e-6 36 #define MMT(s) memset(s, 0, sizeof s) 37 typedef unsigned long long ull; 38 typedef long long ll; 39 typedef double db; 40 typedef long double ldb; 41 typedef stringstream sstm; 42 const int INF = 0x3f3f3f3f; 43 44 map<int,int>mp,vis; 45 int n,k,m; 46 47 int Mod(string x){ 48 int res = 0; 49 for(int i = 0; i < x.size(); i++){ 50 res *= k; 51 if(isdigit(x[i])){ //WA那次就是這裏忘記轉換數字了=7= 52 res += x[i] - ‘0‘; 53 } 54 else{ 55 res += x[i] - ‘A‘ + 10; 56 } 57 res %= n; 58 //cout << res << " "; 59 } 60 return res; 61 } 62 63 int bfs(){ 64 queue<string>q; 65 for(int i = 1; i <= 16; i++){ 66 if(mp[i]){ 67 string a = ""; 68 a = a + char(i>=10?char(‘A‘+i-10):char(‘0‘+i)); //註意轉換 69 int flag = Mod(a); 70 if(flag == 0){ 71 cout << a << endl; 72 return 0; 73 } 74 else{ 75 if(vis[flag] == 0){ 76 vis[flag]++; 77 q.push(a); 78 //cout << a << " " << a.size() << " " << flag << endl; 79 } 80 } 81 } 82 } 83 while(!q.empty()){ 84 string tp = q.front(); 85 q.pop(); 86 if(tp.size() >= 500){ 87 return -1; 88 } 89 for(int i = 0; i <= 16; i++){ 90 if(mp[i]){ 91 string nxt = tp; 92 nxt = nxt + char(i>=10?char(‘A‘+i-10):char(‘0‘+i)); 93 int flag = Mod(nxt); 94 if(flag == 0){ 95 cout << nxt << endl; 96 return 0; 97 } 98 else{ 99 if(vis[flag] == 0){ 100 vis[flag]++; 101 q.push(nxt); 102 //cout << nxt << " " << nxt.size() << " " << flag <<endl; 103 } 104 } 105 } 106 } 107 } 108 return -1; 109 110 } 111 112 int main(){ 113 ios_base::sync_with_stdio(false); 114 cout.tie(0); 115 cin.tie(0); 116 int t; 117 cin>>t; 118 while(t--){ 119 mp.clear(); 120 vis.clear(); 121 cin>>n>>k>>m; 122 for(int i = 0; i < m; i++){ 123 char tp; 124 cin>>tp; 125 if(isdigit(tp)){ 126 mp[tp - ‘0‘]++; 127 } 128 else{ 129 mp[tp - ‘A‘ + 10]++; 130 } 131 } 132 if(n == 0){ //特判n為0的情況 133 if(mp[0]){ 134 cout << 0 << endl; 135 continue; 136 } 137 else{ 138 cout << "give me the bomb please" << endl; 139 continue; 140 } 141 } 142 if(bfs() == -1){ 143 cout << "give me the bomb please" << endl; 144 } 145 } 146 return 0; 147 }
超級密碼(BFS)