UVa1588 | 算法竞赛入门经典(第二版) 习题3-11 换低档装置
生活随笔
收集整理的這篇文章主要介紹了
UVa1588 | 算法竞赛入门经典(第二版) 习题3-11 换低档装置
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
樣例輸入
2112112112
2212112
12121212
21212121
2211221122
21212
樣例輸出
10
8
15
解題思路:
最開始設(shè)想了四種情況, A固定, B左移或右移,或B掉頭,左移或右移, 但經(jīng)驗(yàn)告訴我不可能這么麻煩,
經(jīng)過(guò)搜網(wǎng)后, 發(fā)現(xiàn)陷入了一個(gè)誤區(qū):在日常生活中是可以掉頭的,但是在題給中,塊由數(shù)字組成,所以掉頭數(shù)字也會(huì)
變動(dòng),就不是同一個(gè)木塊了。
因此就只剩下了兩種情況, A固定,B左移或右移, 可以利用其對(duì)稱性簡(jiǎn)化為一種, 也就是寫一個(gè)函數(shù),根據(jù)
傳入?yún)?shù)的不同, 執(zhí)行不同的情況:A固定,B右移 等價(jià)于 A左移,B固定。 縮短代碼長(zhǎng)度。
代碼
#include <iostream> #include <cstdio> #include <string.h> #include <string> #include <algorithm>using namespace std ;//判斷木塊S2位移為k時(shí),是否符合要求 bool test(int k , char s1[] , char s2[] ) {for ( int i = 0 ; s1[k+i] && s2[i] ; i++ ) if(s1[k+i] + s2[i] - 2*'0' > 3) return false ; return true ; }//返回符合要求的情況 int fun(char s1[] , char s2[]) {int k = 0 ; while(!test(k,s1,s2)) //當(dāng)不符合條件時(shí),移位。 k++ ; //為什么返回最大? //若還是S1更長(zhǎng),則返回S1 , 若S2位移了若干位后更長(zhǎng),則返回S2 return max(strlen(s1) , strlen(s2)+k) ; } int main() {char bottom[105] ; //上面的木塊char top[105] ; //下面的木塊while(scanf("%s%s",bottom,top) != EOF) //下條語(yǔ)句判斷左移最優(yōu)解還是右移最優(yōu)解。 cout << min(fun(bottom,top),fun(top,bottom)) << endl ; //調(diào)用algorithm中函數(shù) return 0 ; }收獲:普適性的情況可以寫函數(shù)解決,要養(yǎng)成好習(xí)慣。
總結(jié)
以上是生活随笔為你收集整理的UVa1588 | 算法竞赛入门经典(第二版) 习题3-11 换低档装置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法竞赛入门经典|习题3-8, 循环小数
- 下一篇: Str库系列函数合集(strlen、st