Codeforces 374A - Inna and Pink Pony
原題地址:http://codeforces.com/contest/374/problem/A
好久沒寫題目總結了,最近狀態十分不好,無論是寫程序還是寫作業還是精神面貌……NOIP掛了之后總覺得缺乏動力精神難以集中……CF做的也是一塌糊涂,各種pretest passed + fail system test,該拿下的總是拿不下,都掉成Specialist了,也不知是什么原因,一點點盡力調整吧這是道水題,本來Div2的第一題就沒什么好總結的,但是這道題為整場比賽創造了無數Hack得分(不得不吐槽這場比賽整個就是一逗比……),而且最后AC的人數很少,覺得有必要把沒想清楚的地方捋一下,然后抽時間把之前幾場的題A掉然后把總結寫出來吧
?
題目大意:有一個n*m的方格,位于(i,j)位置上,每次能同時向上下方向移動a并且向左右方向移動b(必須同時向兩個方向移動),求到達任意一個角上所需要的最小移動次數((1,1),(1,m),(n,1),(n,m)中的任意一個),當然,任何時候不可以移動到方格外面
題目分析:非常顯然的,我們首先需要判斷是否有解。通過分析,我們發現當出現以下情況時,我們才可能得到解。
(1)當初始位置在某個角上時(直接輸出0)
(2)初始位置不在角上時,必須與某一個角的垂直距離為k*a,水平距離為t*b(k, t為正整數),且t與k奇偶性相同(原因很簡單,我們必須移動max(k, t)次,這個值顯然可能會比k和t中的某一個大,那樣我們必須在某一方向上先左移再右移(或者先上后下),這個過程需要進行max(k, t) - min(k, t)次,每次操作必須包含兩次移動,所以它們奇偶性應該相同)。
特別需要注意的是,我們必須在每個方向都可移動(即走一步之后不會走出棋盤)
?
然后直接把上面的漢字翻譯成代碼就可以了
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 }?
收獲:還是不僅讀題要細致,考慮解決問題時應該盡量各個方面都考慮到,寫完代碼仔細尋找BUG然后DEBUG,在高質量和熟練度的基礎上再追求速度,不能一味求快,更要求穩。最近沒少犯這樣的錯誤。
轉載于:https://www.cnblogs.com/w007878/p/3484619.html
總結
以上是生活随笔為你收集整理的Codeforces 374A - Inna and Pink Pony的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神逸之作:国产快速启动软件神品ALTRu
- 下一篇: 服务器数据收发测试软件,sokit TC