小X與遊戲(策略)

2021-09-05 09:42:52 字數 1587 閱讀 9521

時間限制: 1 sec  記憶體限制: 128 mb

題目描述

小x和小y正在玩乙個遊戲,這個遊戲是這樣的:桌上放著n疊卡片,每疊恰好有兩張。每張卡片有乙個分數。小x為先手,雙方輪流操作。輪到一方操作時,他可以選擇取走某一疊卡片頂端的那一張(即:若這一疊還剩2張則取走上面的一張,否則取走下面的一張),並獲得它的分數。他也可以選擇不取。若卡片取完了、或者雙方都選擇不取卡片,那麼遊戲結束。

小x和小y都希望自己的分數減去對方的分數盡可能大。現在假設小x和小y都絕頂聰明,總是做出對自己最有利的決策,請算出遊戲結束時小x比小y高多少分。

輸入輸入的第一行包含乙個正整數n。

接下來n行,每行包含2個用空格隔開的非負整數a[i], b[i],分別表示第i疊中放在上面、下面的卡片的分值。

輸出輸出僅有一行包含乙個整數,表示遊戲結束時小x比小y高多少分。如果小x的分數比小y低則輸出乙個負數。

複製樣例資料

2

1 24 3

樣例輸出

1
提示

樣例解釋

小x取走4,小y取走3,小x不取,小y不取,遊戲結束。4-3=1

資料範圍

對於30%的資料,1<=n<=1000, b[i]=0

對於70%的資料,1<=n<=1000

對於100%的資料,1<=n<=100000, 0<=a[i], b[i]<=1000000

首先得搞懂最優策略什麼。

策略:如果輪到小x選擇,那麼肯定選擇所有疊的頂端的最大數,並且,如果那張牌底下有一張比它大的牌,那麼這一疊牌是不會選的。假設全選前小x與小y相差a,如果小x選擇了那一疊(假設上面為x,下面為y且y>x且x為),那麼加上這個數x,那麼輪到小y選擇,肯定會選擇y,那麼差會縮小y-x,這是小x不願看到的,所以這一疊是不會選擇的。小y選擇也是同理。。

ps:可能會有a[i]相同的情況,如果是小x選擇a[i],那麼會優先考慮b[i]小的,這樣可能會使小y加的更少。。。

/**/

#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;

using namespace std;

int n;

struct node

}a;priority_queueq;//優先佇列維護最大值

int main()

ll ans = -(1ll << 60), sum1 = 0, sum2 = 0;//注意ans的範圍和初始化的值

int num = 0;

while(q.size())else

if(t.y != -1) t.x = t.y, t.y = -1, q.push(t);//如果選擇了a[i],那麼b[i]代替a[i],b[i]設為盡量小的值(<0)

num++;

} ans = max(ans, sum1 - sum2);//有可能小y沒有選擇,也要更新下值

printf("%lld\n", ans);

return 0;

}/**/

小 X 玩遊戲 game

題目 時間限制 1 sec 記憶體限制 64 mb 提交 241 解決 81 聽完了故事,小 x 又想去玩一會兒遊戲了。這是乙個很奇特的單機遊戲,遊戲規則如下 遊戲中一共有 4 n 張牌,每張牌上有乙個數字,這些數字恰好是 1 4 n。一開始電腦會把這 4 n張牌隨機打亂,然後會發 2 n 張牌給小...

小X與佇列

題目描述 小x正和同學們做列隊的練習。有n名同學排成一路縱隊,編號為i的同學排在從前往後數第i個位置上,即 初始時的隊列為1,2,3,n。接下來小x會發出若干條指令,每條指令形如 請編號為x的同學排到最前面來 例如 若當前時刻的隊列為5,4,3,2,1,發出一條x 2的指令後,佇列變成了2,5,4,...

小X與佇列

題目 時間限制 1 sec 記憶體限制 128 mb 提交 125 解決 65 小x正和同學們做列隊的練習。有n名同學排成一路縱隊,編號為i的同學排在從前往後數第i個位置上,即 初始時的隊列為1,2,3,n。接下來小x會發出若干條指令,每條指令形如 請編號為x的同學排到最前面來 例如 若當前時刻的隊...