1. 程式人生 > 實用技巧 >Codeforces Round #258 (Div. 2) A. Game With Sticks

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;
}

一放假就開始瘋狂水題了,這波真香...