Codeforces 374A - Inna and Pink Pony
2013-12-20 22:05
330 查看
原题地址: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)次,每次操作必须包含两次移动,所以它们奇偶性应该相同)。
特别需要注意的是,我们必须在每个方向都可移动(即走一步之后不会走出棋盘)
然后直接把上面的汉字翻译成代码就可以了
收获:还是不仅读题要细致,考虑解决问题时应该尽量各个方面都考虑到,写完代码仔细寻找BUG然后DEBUG,在高质量和熟练度的基础上再追求速度,不能一味求快,更要求稳。最近没少犯这样的错误。
好久没写题目总结了,最近状态十分不好,无论是写程序还是写作业还是精神面貌……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)次,每次操作必须包含两次移动,所以它们奇偶性应该相同)。
特别需要注意的是,我们必须在每个方向都可移动(即走一步之后不会走出棋盘)
然后直接把上面的汉字翻译成代码就可以了
//date 20131218 #include <cstdio> #include <cstring> const int INF = 99999999; inline int min(int a, int b){return a < b ? a : b;} inline int max(int a, int b){return a > b ? a : b;} int n, m, x, y, a, b; int main() { //freopen("a.in", "r", stdin); scanf("%d%d%d%d%d%d", &n, &m, &x, &y, &a, &b); if((((x - 1) % a != 0) && ((n - x) % a != 0)) || (((y - 1) % b != 0) && ((m - y) % b != 0))) { printf("Poor Inna and pony!\n"); return 0; } if(((x == 1) || (x == n)) && ((y == 1) || (y == m))) { printf("0\n"); return 0; } int ans = INF; 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))) ans = min(ans, max((x - 1) / a, (y - 1) / b)); 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))) ans = min(ans, max((x - 1) / a, (m - y) / b)); 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))) ans = min(ans, max((n - x) / a, (y - 1) / b)); 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))) ans = min(ans, max((n - x) / a, (m - y) / b)); if(ans == INF)printf("Poor Inna and pony!\n"); else printf("%d\n", ans); return 0; }
收获:还是不仅读题要细致,考虑解决问题时应该尽量各个方面都考虑到,写完代码仔细寻找BUG然后DEBUG,在高质量和熟练度的基础上再追求速度,不能一味求快,更要求稳。最近没少犯这样的错误。
相关文章推荐
- 【打CF,学算法——二星级】CodeForces 374A Inna and Pink Pony (水题/坑题)
- codeforces 374A Inna and Pink Pony(数学)
- CodeForces 374A Inna and Pink Pony
- CF:374A - Inna and Pink Pony(思想题)
- CodeForces 374 A. Inna and Pink Pony
- 220 DIV2 A. Inna and Pink Pony
- A. Inna and Pink Pony----暴力
- CF #220 Inna and Pink Pony
- cf A. Inna and Pink Pony(思维题)
- 220 DIV2 A. Inna and Pink Pony
- A. Inna and Pink Pony
- Codeforces 390A Inna and Alarm Clock(水题)
- codeforces 400B - Inna and New Matrix of Candies
- !codeforces 400E Inna and Binary Logic-yy-(位运算)
- Codeforces 453B B. Little Pony and Harmony Chest(dp+数论)
- Codeforces Div. 2 #259-B. Little Pony and Sort by Shift
- codeforces 400C - Inna and Huge Candy Matrix
- CodeForces 400E Inna and Binary Logic
- codeforces 374C Inna and Dima (dfs+记忆化)
- CodeForces 453 A.Little Pony and Expected Maximum(快速幂)