題目大意:求乙個數,它是由m個數字組成,是c進製,且是n(10進製整數)的整數倍。求這個數的最小值。
例如n=22,c=10,m=3,三個數字是7,0,1;那麼滿足由7,0,1組成的10進製數且是22的倍數的最小值是110。
由於求的數是最小的,用bfs比dfs更好一些。用bfs實現由數字組成的數按從小到大放入佇列中,如果滿足題目要求的條件,就輸出並退出。密碼最多有500位,必須用陣列儲存這個數。在判斷這個數是否是n的倍數時,要用剩餘定理。
(a+b)%n = a%n + b%n
例如我想判斷16進製制的數ccb是否是10進製數25的倍數(c是12,b是11)我們從高位向低位依次計算:
(12*16+12)%25 = 4
(4*16+11)%25 = 0
所以ccb是25的倍數。
剪枝:因為通過bfs產生的數是從小到大產生的,所以如果兩個數(兩個數肯定是一大一小)取模的餘數相等了話,在以後的bfs中這兩個數的變化是相同的,而題目求的是最小的數,較大的數就不用再進行bfs了。
#include #include #include #include using namespace std;
int digit[20];
int vis[5010];
int t,n,c,m;
struct node
;int judge(node p)
if( n==0 && digit[0] ) //只有0才是0的正整數倍
cout<<0
cout<<"give me the bomb please"
cout<<"give me the bomb please"<}
return 0;
}
hdu1226 超級密碼 bfs
思路 因為n 5000 所以方案個數也只有5000個,可以用bfs來做。一開始挺糾結怎麼做,但是上網一看別的大牛的 一下子就恍然大悟豁然開朗,如同撥開雲霧見青天 o include include include include using namespace std const int maxn ...
HDU1226 超級密碼 BFS
由於n最大也只有5000,則對於列舉的密碼s,s n的狀態也只有5000種。所以每乙個列舉到的狀態,開兩個內容,乙個表示密碼的字串,乙個表示模n的餘數,當餘數為0的時候,說明找到密碼。include include include include include using namespace st...
hdu 1226 超級密碼 bfs
c 超級密碼 time limit 10000msmemory limit 32768kb64bit io format i64d i64u submit status description ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在...