CQOI2013 新nim遊戲題解

2022-08-22 13:15:13 字數 1374 閱讀 6857

傳統的nim遊戲是這樣的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴數量可以不同)。兩個遊戲者輪流操作,每次可以選乙個火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同時從超過一堆火柴中拿。拿走最後一根火柴的遊戲者勝利。

本題的遊戲稍微有些不同:在第乙個回合中,第乙個遊戲者可以直接拿走若干個整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一樣,第二個遊戲者也有這樣一次機會。從第三個回合(又輪到第乙個遊戲者)開始,規則和nim遊戲一樣。

如果你先拿,怎樣才能保證獲勝?如果可以獲勝的話,還要讓第一回合拿的火柴總數盡量小。

【輸入格式】

第一行為整數k。即火柴堆數。第二行包含k個不超過109的正整數,即各堆的火柴個數。

【輸出格式】

輸出第一回合拿的火柴數目的最小值。如果不能保證取勝,輸出-1。

【輸入輸出樣例】

nim.in

nim.out

5 5 6 6 5 5

nim.in

nim.out

1 2 3

【資料範圍】

編號1-5

6-10

k<=10

<=100

現場考這個題的時候,我看到這個題就笑了(原來做過類似的(bjoi2010元素)),本弱就是靠這個題進了省隊啊。

還是簡單的說一下吧

本題就是選乙個最大的集合,使該集合的所有子集異或起來都不得0。用擬陣證明這個題用貪心演算法是對的,然後用類似高斯消元解異或方程的的東西就解決了。

#include

#include

#include

#include

using namespace std;

typedef long long llint;

const llint maxn=220;

llint data[maxn],n,ans[maxn],cnt,sum,wdy;

llint matrix[maxn][maxn];

void solve()

m=max(m,ret);

}n=n;

for(llint i=1,j=1;i<=n&&j<=m;++i,++j)

++k;

}if(!flag)

sum+=data[n-i+1];

for(llint pos=1;pos<=n;++pos)

swap(matrix[pos][j],matrix[pos][k]);

for(llint w=i+1;w<=n;++w)}}

}int main()

sort(data+1,data+1+n);

solve();

cout

//fclose(stdout);

}

CQOI2013 新NIM遊戲(線性基)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 傳統的nim遊戲是這樣的 有一些火柴堆,每堆都有若干根火柴 不同堆的火柴數量可以不同 兩個遊戲者輪流操作,每次可以選乙個火柴堆拿走若干根火柴。可以只拿一根,也可以拿...

CQOI2013 棋盤遊戲

emmmm因為b的活動範圍比a廣,所以只要不是第一步被a吃掉,終究會贏得勝利的 根本不會有平局嘛 上面那個結論一定要先確定好,不知道結果的話沒法對抗搜尋的。然後就.我們的目的是讓b盡快地贏,a盡可能地多跑一會兒,所以前者取min後者取max。qaq 但是講道理應該步數不應該是2 n以內嘛.我也不太明...

3106 cqoi2013 棋盤遊戲

乙個n n n 2 棋盤上有黑白棋子各一枚。遊戲者a和b輪流移動棋子,a先走。a的移動規則 只能移動白棋子。可以往上下左右四個方向之一移動一格。b的移動規則 只能移動黑棋子。可以往上下左右四個方向之一移動一格或者兩格。和通常的 吃子 規則一樣,當某遊戲者把自己的棋子移動到對方棋子所在的格仔時,他就贏...