Codeforces Round #258 (Div. 2) A. Game With Sticks
阿新 • • 發佈:2020-12-08
題目連結: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; }
一放假就開始瘋狂水題了,這波真香...