Codeforces Round #258 (Div. 2) A. Game With Sticks
题目链接:https://codeforces.com/problemset/problem/451/A



题意:给n条水平线与m条垂直线进行相交形成一个网格,在任意两条相交线中会有一个交点,这两名选手任意选择一个点后,在这个点上的一对相交线就会消失,最后哪名选手无法选择在相交线的点时即对方赢。
题解:其实每一次选择一个点 n -> n-1, m -> m-1, 都会发生这个变化,所以肯定有一定规律可循,直接盲猜和奇偶有关,然后我就分了三种情况:
- 若n与m均为奇数,那么A必赢;
- 若n与m均为偶数,那么M必赢;
- 若n与m为一奇一偶(其实与n、m大小并没什么关系): 若(n+m+1)能被4整除A必赢 。
- n = 1, m = 2 A赢
- n = 2, m = 3 M赢
- n = 3, m = 4 A赢
- n = 4, m = 5 M赢
- n = 5, m = 6 A赢
代码:
#include<bits/stdc++.h>
using namespace std;
int n, m;
int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
if((n & 1) && (m & 1)) cout << "Akshat" << endl; //n,m均为奇数
else if(!(n & 1) && !(m & 1)) cout << "Malvika" << endl; //n,m均为偶数
else //n,m一奇一偶
{
if((n + m + 1) % 4 == 0) cout << "Akshat" << endl;
else cout << "Malvika" << endl;
}
return 0;
}
然而官方题解比较有意思,题解的规律是答案和(n, m)的大小有关,仅与min(n, m)的值有关, 若min(n,m) 能被2整除则M必赢,否则A必赢。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
if (n > m) {
swap(n, m);
}
if (n % 2 == 0) {
cout << "Malvika" << endl;
} else {
cout << "Akshat" << endl;
}
return 0;
}
一放假就开始疯狂水题了,这波真香...

浙公网安备 33010602011771号