計蒜客 16877 卡牌遊戲

2022-05-18 06:46:39 字數 1830 閱讀 2430

題目鏈結

題目大意:桌子上有n堆牌,每堆牌有si張,每張牌上有個數。小明和小紅玩遊戲,小紅女士優先,每次從任意乙個牌堆頂部取出一張,小明長得醜,每次從任意乙個牌堆底部取一張。假設他倆都按照最優的方式取牌,那麼誰最後得到的所有牌的數字的和大。

解題思路:首先我們考慮牌個數為偶數的幾堆,那麼你會發現,無論小紅選哪兒個,小明只要跟著她選對應牌堆底部的,那麼他倆總會各選頂部或底部一半牌,而且無論誰先手都是一樣,顯然這樣也是最優的(我不會讓你多拿屬於我的)。因此現在我們只考慮奇數牌堆:假設一堆牌有5張牌,那麼小紅可以保證上面兩張總是自己的,小明可以保證下面兩張總是自己的(小明如果打算選小紅的頂部兩張,那麼只要小紅攆著小明的步子選頂部的小明就不會得逞)。但是由於小紅先手,因此倘若小明發現小紅選了中間數是所有奇數牌堆中最大的那個奇數牌堆,那麼小明便可以選擇去選中間值第二大的牌堆底部的牌,以此類推,最終小紅可以得到 應該屬於自己的 + 第一大 + 第三大 + 第五大 + ……, 而小明則可以得到 應該屬於自己的 + 第二大 + 第四大 + 第六大 + ……(應該屬於自己的指的就是頂部一半和底部一半)。

具體過程可以將中間值抽出來排序然後計算即可。

**:

1

const

int maxn = 1e2 + 5;2

int n, tot = 0;3

intc[maxn][maxn], s[maxn];

4 vectorvec;56

void

solve()18}

19 u = (u + 1) / 2;20

int tmp = v - u, j = vec.size() - 2;21

sort(vec.begin(), vec.end());

22for(int i = 0; i < tmp; i++)27}

28if(tot - ans > ans) puts("

lose");

29else

if(tot - ans == ans) puts("

tie"

);30

else puts("

win"

);31}32

intmain()40}

41solve();

42 }

題目:韓梅梅和她的朋友李雷玩卡牌遊戲。桌子上有成n堆卡片。每張卡片上都有乙個正整數,表示該卡片的價值。

玩家輪流取牌,韓梅梅先手。每個回合,韓梅梅從任意乙個非空堆的頂部取牌,李雷從任意乙個非空堆的底部取牌。兩個人都想最大化他所拿卡片的總價值。當所有堆為空時,遊戲結束。

假設李雷和韓梅梅都採取最佳策略,輸出最後的贏家。

input:

第一行包含乙個整數n(1 ≤ n ≤ 100),表示有n堆卡牌。接下來的n行每行包含第i堆卡牌的資訊:

行中的第乙個整數是si(1 ≤ si ≤ 100)表示第i個堆牌的數量;然後是si個正整數c1,c2,…,ck,…,csi(1 ≤ ck ≤ 1000),表示從頂部到底部的卡牌價值序列。

output:

遊戲結束時,如果韓梅梅手中卡牌的價值總和大於李雷手中卡牌的價值總和,輸出「win」,如果平局,輸出「tie」,否則輸出「lose」。

樣例輸入1

2

1 100

2 1 10

樣例輸出1

win

樣例輸入2

3

5 1 2 3 4 5

4 1 2 3 4

8 1 2 3 4 5 6 7 8

樣例輸出2

lose

題目**

acm 競賽高校聯盟 練習賽 第六場

計蒜客卡牌遊戲

問題描述 蒜頭君手裡有 n 張卡牌,編號從 1 到 n,每張卡牌上面有乙個數字 num i 現在蒜頭君將 n 張卡牌排成一行,組成乙個序列,執行以下操作 從序列中抽取一張編號為 i 的卡牌,則該張卡牌貢獻的得分為 num i 1 num i num i 1 即卡牌上的數字同左右兩張相鄰的卡牌上的數字...

計蒜客 乘法遊戲

乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是10 1 50 ...

計蒜客 跳躍遊戲

給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。請確認你是否能夠跳躍到陣列的最後乙個下標。例如 a 2,3,1,1,4 return true.a 3,2,1,0,4 return false.格式 第一行輸入乙個正整數n,接下來的一行,輸...