题目描述
有一天YMW看见竞赛室里面放着n个正面向上的杯子,他随手把所有的杯子翻转成正面向下的杯子了。后来突然想起来自己有两只手,于是他尝试同时翻转两只杯子,看下最后能不能翻转成为全部正面朝下。聪明的你看到了这一切,突然脑子里面闪过一个问题,假如每次同时翻转m只杯子,最后能全部翻转成为正面朝下吗?(初始时全部正面朝上)
思路
因为是可以不连续放,所以我们是需要记录有多少个是正放的即可
然后暴力bfs出每种状态,加上判重就可以a了
#include#include #include using namespace std; #define fill(x, y) memset(x, y, sizeof(x)); bool v[20001]; int main() { while (1) { int n, m; scanf("%d%d", &n, &m); if (m > n) m = m - n; if (n == -1 && m == -1) break; queue t; t.push(n); v[n] = 1; int fl = 1; while (!t.empty()) { int now = t.front(); t.pop(); for (int i = 0; i <= m; i++) if (now >= i && n - now >= m - i && !v[now - 2 * i + m]) { v[now - 2 * i + m] = 1; t.push(now - 2 * i + m); if (now - 2 * i + m == 0) { fl = 0; printf("Yes\n"); while (!t.empty()) t.pop(); break; } } } if (fl) printf("No\n"); fill(v, 0); } }
]]>
Comments NOTHING