總時間限制:
1000ms
記憶體限制:
65536kb
描述給定乙個包含5個數字(0-9)的字串,例如 「02943」,請將「12345」變換到它。 你可以採取3種操作進行變換
1. 交換相鄰的兩個數字
2. 將乙個數字加1。如果加1後大於9,則變為0
3. 將乙個數字加倍。如果加倍後大於9,則將其變為加倍後的結果除以10的餘數。
最多只能用第2種操作3次,第3種操作2次 求最少經過多少次操作可以完成變換。
輸入有最多 100,000 組資料
每組資料就是包含5個數字的字串
輸出對每組資料,輸出將"12345"變換到給定字串所需要的最少操作步數。如果無法變換成功,輸出-1
樣例輸入
12435樣例輸出99999
12374
1提示-13
由於測試資料太多,如果對每組資料都從頭進行搜尋,就會超時。
建議先做預處理,即以「12345」作為初始狀態做一遍徹底的廣搜,找出「12345」經合法變換能夠到達的所有字串,並記錄到達這些字串各需要多少步操作。
然後對讀入的每組資料,在上述預處理記錄的結果中進行查詢即可。
**guo wei
1 #include2 #include3 #include4 #include5 #include6
using
namespace
std;
7char a[6] = "
12345";
8bool vis[100000][4][3];9
int ans[100000
];10
struct
node;
14};
15 queueq;
16int
main()
35 swap(temp[i], temp[i+1
]);36}37
//第二種操作
38if(no.op2<3)49
}50} 51
52//
第三種操作
53if(no.op3<2)64
}65}66
}67while(cin>>a)
70return0;
71 }
備註:睡前能用兩次就過了這道題很開心!!!wa是因為vis陣列初始化成了-1 orz 之前還犯過的錯誤是,temp沒有及時在每個迴圈的開頭重置成a。
最開始思考了一下,用什麼來定義狀態,記錄已經進行了哪些操作嗎?好像沒法記……然後想到,每個數最大就99999,可以把數字定義為狀態啊。另外,因為操作二和操作三都有次數限制,所以這個次數也要納入維度裡,所以就用乙個三維vis陣列來記錄狀態就可以了。
這道題獲得的啟發就是,不要慫,搜就行了,反正一共就考那麼幾種演算法,不是動規就是考bfs就是dfs,要不然就是神奇模擬,也沒有複雜演算法!!
經常犯錯的地方無非就是初始化、重置、清零之類的地方,檢查的時候要注意。
F 數字乘積
傳送門 這道題我一直wa 下來問了一下別人結果發現個位數我們就直接輸出n就行了 不需要輸出n 10 n 我就是乙個菜雞 而且寫的遞迴函式的終止條件也不是很好 唉 include include include include include include include include inclu...
F1 F12功能使用
聯想筆記本鍵盤上的f1 f12怎樣用?key 按fn的鍵,再按f1 f12其中的鍵就可以用了。f1 如果你處在乙個選定的程式中而需要幫助,那麼請按下f1。如果現在不是處在任何程式中,而是處在資源管理器或桌面,那麼按下f1就會出現 windows的幫助程式。如果你正在對某個程式進行操作,而想得到win...
F12的簡單使用
chrome瀏覽器的開發者工具可通過f12快捷鍵開啟 1.調整開發者工具在頁面的顯示 2.檢查介面元素,裝置切換,網頁或終端 終端選擇 斷點檢視 3.可檢視不同手機的介面適配問題 4.如何打斷點 5.目標位置介面點選滑鼠右鍵,檢查,也可開啟開發者工具同時element元素,是選中目標元素。6.修改介...