17972 Golden gun的巧克力
时间限制:1000MS 内存限制:65535K
提交次数:93 通过次数:13 收入:124
题型: 编程题 语言: G++;GCC;JAVA
Description
众所周知,13级有尊大神Golden gun,人称根叔,简称金枪!众立志进校队的师弟如果不认识这个成功人士,我只能说太失败了! 他出手阔绰,首战夺金!由于工作关系,Golden gun坐享艺术学院所有资源,他可以自豪地说:“我要让全世界都知道!华农的艺术学 院的MM市场都让我承包了!”,据某可靠消息来源称,Golden gun的短号非常抢手,在艺术学院可谓是无人不晓。经常会有艺术学院的 MM拨打这个热线希望Golden gun大神能给MM一丢丢的时间 经常在智商上狠狠鄙视我这个弱菜师妹的成功人士Golden gun当然不会追求肤浅的外在美,而是内在美!现在请允许我用七字真言 来阐释内在美的真谛,那就是,脸好还要智商高!用一个四字词语概括:脑残退散。被艺术学院的MM们电话骚扰后,Golden gun为了认 真切题决定出手虐MM! Golden gun让弱菜师妹出了一个题:我们定义,在一个N*M的盒子A中,每个格子的巧克力数量为Aij。MM可以在其中选择在一个格子 上加任意t个巧克力,如果有相邻(即两个格子拥有一条公共边)的情况,则必然要选择其中一个相邻的格子上加相同t个巧克力。 (注意:Aij和t都可以为负也可以为正)如果MM在任意次操作后可以把盒子上每个格子上的巧克力数量都变成0,即称为高智商白富美, GG就会由衷的欣赏这个MM,然后…你们懂的。 那么问题来了,MM不知道自己能不能约到Golden gun,就来求助万能的师弟师妹希望预见结局,如果整盒巧克力不能成功归为零,那 么只能遗憾地输出“gun!”,如果可以的话,那就可以很高兴地输出“yue!”了。 出题人:locked_M
输入格式
测试数据有多组。 每组数据第一行两个整数N,M(1<=N,M<=5). 第二行到第N+1行,每行有M个数,每个数的取值范围是[-5000,5000]. 输入以0 0结束
输出格式
如果不能成功归零,输出“gun!”,否则输出“yue!”
输入样例
2 2 0 0 1 1 2 2 1 1 1 0 0 0
输出样例
yue! gun!
作者
201330340218
一题坑爹题,
明显如果能全部变成0的话,什么样的顺序是没关系的。可以直接模拟。
关键就是如果n == 1 && n == m的时候。
直接yue,因为没有相邻的格子。。
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #define IOS ios::sync_with_stdio(false) using namespace std; #define inf (0x3f3f3f3f) typedef long long int LL; #include <iostream> #include <sstream> #include <vector> #include <set> #include <map> #include <queue> #include <string> int a[33][33]; int n, m; void work() { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { scanf("%d", &a[i][j]); } } if (n == 1 && n == m) { printf("yue! "); return; } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (j + 1 <= m) { a[i][j + 1] += 0 - a[i][j]; a[i][j] = 0; } else if (i + 1 <= n) { a[i + 1][j] += 0 - a[i][j]; a[i][j] = 0; } } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (i == n && j == m) continue; if (a[i][j]) while(1); // printf("%d ", a[i][j]); } // printf(" "); } if (a[n][m]) { printf("gun! "); } else printf("yue! "); } int main() { #ifdef local freopen("data.txt","r",stdin); #endif while (scanf("%d%d", &n, &m) != EOF && n + m) { work(); } return 0; }
关于为什么顺序没关系,我解释下
假如从(1, 1)走到(3, 4),我们要经过的总步数是5步。假如那个数字是1,那么走到(3, 4)的时候的数字肯定是-1.不管你兜多少个圈,因为这是奇偶性的问题,哈密顿距离是奇数,那么去到这个点的步数也只能是奇数。
因为要偶数步兜一个圈。所以把她们都集中在a[n][m],结果是一样的。
标程的做法就是统计奇数步和偶数步的总数值