C - Piles of Pebbles
题意:
n堆鹅卵石,第一个人可以拿任意堆x个,第二个人可以拿任意堆y个,第一个人先拿,谁不能拿谁败。
思路:
这个题我一直没读清楚,如文章标题,拿的是固定数目x和y。
为什么可以取余:
我们可以对每一对鹅卵石都取余(x+y)。
因为我拿某堆x个,你就拿对应堆y个去跟进我,你就很稳。
(只对于所有大于等于x+y的时候,比如就是x+y,你拿x,我就可以操作拿y个,这样这堆为0你就无法操作了。
所以虽然先手可能有利,但x+y绝对不利,也“没有意义”。之后也没必要再关注0。)
取余后:
然后剩下的就又该第一个人拿了。
〇如果都小于x,那么x败。
————
不然就可以分类讨论了:
①x < y
x赢,因为存在大于x的,即使有大于y的,x都可以拿。直接导致第二个人没有可取的。
②x==y
其实和上述一样。
③x > y
只要存在y可以拿且x不能拿的,第二个人胜。
x就算不拿完,y可以让x没得拿。
参考代码:
#define endl "\n"const int maxn = 2e5 + 5;
int arr[maxn];
void solve()
{int n, x, y;cin >> n >> x >> y;for (int i = 1; i <= n; i++){cin >> arr[i];arr[i] %= (x + y);}for (int i = 1; i <= n; i++){if (arr[i] >= x)//x得有能取的 //0其实不用管,被后手压制了{break;}if (i == n){cout << "Second" << endl;return;}}if (x < y){cout << "First" << endl;return;}else{for (int i = 1; i <= n; i++){if (arr[i] < x && arr[i] >= y){cout << "Second" << endl;return;}}}cout << "First" << endl;}
signed main()
{freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int t = 1;//cin >> t;while (t--){solve();}return 0;
}