第39題
(取石子)Alice 和 Bob 兩個(gè)人在玩取石子游戲,他們制定了 n 條取石子的規(guī)則,第 i 條規(guī)則為:如果剩余的石子個(gè)數(shù)大于等于 a[i] 且大于等于 b[i],那么她們可以取走 b[i] 個(gè)石子。他們輪流取石子。如果輪到某個(gè)人取石子,而她們無(wú)法按照任何規(guī)則取走石子,那么他就輸了,一開(kāi)始石子有 m 個(gè)。請(qǐng)問(wèn)先取石子的人是否有必勝的方法?
輸入第一行有兩個(gè)正整數(shù),分別為規(guī)則個(gè)數(shù) n(1≤n≤64),以及石子個(gè)數(shù) m(≤107)。
接下來(lái) n 行。第i行有兩個(gè)正整數(shù) a[i]和 b[i]。1≤a[i]≤107,b[i]≤64
如果先取石子的人必勝,那么輸出“Win”,否則輸出“Loss”
提示:
可以使用動(dòng)態(tài)規(guī)劃解決這個(gè)問(wèn)題。由于b[i] 不超過(guò) 64,所以可以使用位無(wú)符號(hào)整數(shù)去壓縮必要的狀態(tài)。
Status 是勝負(fù)狀態(tài)的二進(jìn)制壓縮,trans 是狀態(tài)轉(zhuǎn)移的二進(jìn)制壓縮。
代碼說(shuō)明:
“~”表示二進(jìn)制補(bǔ)碼運(yùn)算符,它將每個(gè)二進(jìn)制位的 0 變成 1、1 變?yōu)?0;
而“^”表示二進(jìn)制異或運(yùn)算符,它將兩個(gè)參與運(yùn)算的數(shù)重的每個(gè)對(duì)應(yīng)的二進(jìn)制位一一進(jìn)行比較,若兩個(gè)二進(jìn)制位相同,則運(yùn)算結(jié)果的對(duì)應(yīng)二進(jìn)制位為 0,反之為 1。
ull 標(biāo)識(shí)符表示它前面的數(shù)字是 unsigned long long 類型。
試補(bǔ)全程序
#include <cstdio>
#include<algorithm>
using namespace std ;
const int maxn =64;
int n,m;
int a[maxn], b[maxn];
unsigned long long status, trans;
bool win;
int main() {
scanf(“%d%d”,&n, &m);
for (int i = 0; i < n; ++i)
scanf(“%d%d”, &a[i], &b[i]);
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
if (aa[i] > a[j]) {
swap(a[i], a[j]);
swap(b[i], b[j]);
}
status = ①;
trans = 0;
for (int i = 1, j = 0; i <= m; ++i) {
while (j < n && ②) {
③;
++j;
}
win = ④;
⑤;
}
puts(win ? “Win” : “Loss”);
return 0;
}
① 處應(yīng)填( )