Codeforces 374A - Inna and Pink Pony
原題地址:http://codeforces.com/contest/374/problem/A
好久沒寫題目總結(jié)了,最近狀態(tài)十分不好,無論是寫程序還是寫作業(yè)還是精神面貌……NOIP掛了之后總覺得缺乏動(dòng)力精神難以集中……CF做的也是一塌糊涂,各種pretest passed + fail system test,該拿下的總是拿不下,都掉成Specialist了,也不知是什么原因,一點(diǎn)點(diǎn)盡力調(diào)整吧這是道水題,本來Div2的第一題就沒什么好總結(jié)的,但是這道題為整場(chǎng)比賽創(chuàng)造了無數(shù)Hack得分(不得不吐槽這場(chǎng)比賽整個(gè)就是一逗比……),而且最后AC的人數(shù)很少,覺得有必要把沒想清楚的地方捋一下,然后抽時(shí)間把之前幾場(chǎng)的題A掉然后把總結(jié)寫出來吧
?
題目大意:有一個(gè)n*m的方格,位于(i,j)位置上,每次能同時(shí)向上下方向移動(dòng)a并且向左右方向移動(dòng)b(必須同時(shí)向兩個(gè)方向移動(dòng)),求到達(dá)任意一個(gè)角上所需要的最小移動(dòng)次數(shù)((1,1),(1,m),(n,1),(n,m)中的任意一個(gè)),當(dāng)然,任何時(shí)候不可以移動(dòng)到方格外面
題目分析:非常顯然的,我們首先需要判斷是否有解。通過分析,我們發(fā)現(xiàn)當(dāng)出現(xiàn)以下情況時(shí),我們才可能得到解。
(1)當(dāng)初始位置在某個(gè)角上時(shí)(直接輸出0)
(2)初始位置不在角上時(shí),必須與某一個(gè)角的垂直距離為k*a,水平距離為t*b(k, t為正整數(shù)),且t與k奇偶性相同(原因很簡(jiǎn)單,我們必須移動(dòng)max(k, t)次,這個(gè)值顯然可能會(huì)比k和t中的某一個(gè)大,那樣我們必須在某一方向上先左移再右移(或者先上后下),這個(gè)過程需要進(jìn)行max(k, t) - min(k, t)次,每次操作必須包含兩次移動(dòng),所以它們奇偶性應(yīng)該相同)。
特別需要注意的是,我們必須在每個(gè)方向都可移動(dòng)(即走一步之后不會(huì)走出棋盤)
?
然后直接把上面的漢字翻譯成代碼就可以了
1 //date 20131218 2 #include <cstdio> 3 #include <cstring> 4 5 const int INF = 99999999; 6 7 inline int min(int a, int b){return a < b ? a : b;} 8 inline int max(int a, int b){return a > b ? a : b;} 9 10 int n, m, x, y, a, b; 11 12 int main() 13 { 14 //freopen("a.in", "r", stdin); 15 16 scanf("%d%d%d%d%d%d", &n, &m, &x, &y, &a, &b); 17 18 if((((x - 1) % a != 0) && ((n - x) % a != 0)) || (((y - 1) % b != 0) && ((m - y) % b != 0))) 19 { 20 printf("Poor Inna and pony!\n"); 21 return 0; 22 } 23 24 if(((x == 1) || (x == n)) && ((y == 1) || (y == m))) 25 { 26 printf("0\n"); 27 return 0; 28 } 29 30 int ans = INF; 31 32 if( (((x + a <= n) || (x - a > 0)) && ((y + b <= m) || (y - b > 0))) && (((x - 1) % a == 0) && ((y - 1) % b == 0)) && ((((x - 1) / a) & 1) == (((y - 1) / b) & 1))) 33 ans = min(ans, max((x - 1) / a, (y - 1) / b)); 34 35 if( (((x + a <= n) || (x - a > 0)) && ((y + b <= m) || (y - b > 0))) && (((x - 1) % a == 0) && ((m - y) % b == 0)) && ((((x - 1) / a) & 1) == (((m - y) / b) & 1))) 36 ans = min(ans, max((x - 1) / a, (m - y) / b)); 37 38 if( (((x + a <= n) || (x - a > 0)) && ((y + b <= m) || (y - b > 0))) && (((n - x) % a == 0) && ((y - 1) % b == 0)) && ((((n - x) / a) & 1) == (((y - 1) / b) & 1))) 39 ans = min(ans, max((n - x) / a, (y - 1) / b)); 40 41 if( (((x + a <= n) || (x - a > 0)) && ((y + b <= m) || (y - b > 0))) && (((n - x) % a == 0) && ((m - y) % b == 0)) && ((((n - x) / a) & 1) == (((m - y) / b) & 1))) 42 ans = min(ans, max((n - x) / a, (m - y) / b)); 43 44 if(ans == INF)printf("Poor Inna and pony!\n"); 45 else printf("%d\n", ans); 46 47 return 0; 48 }?
收獲:還是不僅讀題要細(xì)致,考慮解決問題時(shí)應(yīng)該盡量各個(gè)方面都考慮到,寫完代碼仔細(xì)尋找BUG然后DEBUG,在高質(zhì)量和熟練度的基礎(chǔ)上再追求速度,不能一味求快,更要求穩(wěn)。最近沒少犯這樣的錯(cuò)誤。
轉(zhuǎn)載于:https://www.cnblogs.com/w007878/p/3484619.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces 374A - Inna and Pink Pony的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神逸之作:国产快速启动软件神品ALTRu
- 下一篇: 服务器数据收发测试软件,sokit TC