Codeforces Round #258 (Div. 2) A. Game With Sticks

题目链接:https://codeforces.com/problemset/problem/451/A

题意:给n条水平线与m条垂直线进行相交形成一个网格,在任意两条相交线中会有一个交点,这两名选手任意选择一个点后,在这个点上的一对相交线就会消失,最后哪名选手无法选择在相交线的点时即对方赢。

题解:其实每一次选择一个点 n -> n-1, m -> m-1, 都会发生这个变化,所以肯定有一定规律可循,直接盲猜和奇偶有关,然后我就分了三种情况:

  1. 若n与m均为奇数,那么A必赢;
  2. 若n与m均为偶数,那么M必赢;
  3. 若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;
}

一放假就开始疯狂水题了,这波真香...

posted @ 2020-12-08 11:04  ~K2MnO4  阅读(84)  评论(0)    收藏  举报