1 条题解
-
0
解题思路
对于这种题目,我们一般先手玩一波。
手玩发现:同时先手当且仅当石子有偶数堆并且对称时必败(这一个结论看似简单,实际要想到可能会话几十分钟),因为后手只要照着先手操作,先手必败(至于唯一性只能靠感悟了)
于是题目就转化成判断是否是对称的。
做此类博弈类手玩题的技巧:
一定要自己多手玩,几十次也不为过。要各种极端情况全部考虑 对于一种看似正确的算法,一定要尽量给出证明,实在不行也要多举例子直到实在举不出反例为止
标程
#include <iostream> #include <queue> #include <cstdio> // 补充scanf所需头文件 #include <vector> // 补充priority_queue依赖的vector头文件(C++98需要显式包含) using namespace std; int main() { int n, x; while (scanf("%d", &n) != EOF && n) { // 读取n直到遇到EOF或n为0 int flag = 1; priority_queue<int> q; // 默认使用vector<int>作为底层容器(需包含<vector>) int i; // C++98要求变量声明在作用域开头 for (i = 1; i <= n; ++i) { // 遍历n个数 scanf("%d", &x); // 读取每个数 q.push(x); // 存入优先队列(大顶堆) } if (n % 2 == 1) { // 奇数个元素直接无法配对 cout << "1" << endl; continue; } // 偶数个元素时,检查是否能两两相等 while (q.size() >= 2) { int m = q.top(); // 取最大元素 q.pop(); int n_val = q.top(); // 取次大元素 q.pop(); if (m != n_val) { // 无法配对 cout << "1" << endl; flag = 0; break; } } if (flag) { // 所有元素成功配对 cout << "0" << endl; } } return 0; }
- 1
信息
- ID
- 741
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者