NOIP模擬 好題 分玩具

2021-08-09 05:44:00 字數 1842 閱讀 8268

題目描述:

豆豆和豆沙正在分一些玩具,每個玩具有乙個好玩值,每個人可以拿走任意數量的玩具,獲得的愉快度為最小的好玩值。現在豆豆先拿,每個人輪流操作,直到沒有玩具可以拿。豆豆想知道他能比豆沙多出多少愉快度?

輸入格式:

第一行 n 表示玩具個數。

接下來一行 n 個整數表示第 i 個玩具的好玩值。

輸出格式:

輸出乙個整數表示最多多出的愉快度。

樣例輸入:

3

1 3 1

樣例輸出:

資料範圍:對於 30% 的資料,n≤

10 。

對於 70% 的資料,n≤

1000

。 對於 100 %的資料,n≤

1000000

,0≤ 數值範圍≤10

9 。

注意:計算方式是每輪都會計算,不是最後總的算。還有這兩個人都是絕頂聰明的,即他們每次都是按照最優解拿的。

題目分析:

考試時,第一眼看到題,內心是這樣的:什麼?博弈論?noip不是不考嗎?十分鐘後······半個小時後······乙個小時後,怎麼做,沒思路啊!!!

先上題解:

其實兩個人的目標是一致的,都是想是使自己的最小值盡量大。因為乙個人對於當前序列,當然是取最大的一部分最優秀(雖然取幾個是不清楚的),所以我們可以先排序。當有乙個人取走一部分後,剩餘序列對於當前選擇的人,抉擇問題其實是一樣的,只是序列變短了。所以整道題只是乙個不斷遞迴的子問題。

我們假設一段序列(從小到大),為1~n,假設我們序列現在又是1~j,肯定又存在1~j的最優情況,那麼假設我們已經求出了1~j的最優秀情況,記錄為f[j](記錄的是最後取的那個人總的多出的愉悅度),那麼對於另乙個人,j+1有選與不選的情況,選的話相當於你的愉悅度就是a[j+1],那你多出的就是a[j+1]-f[j],如果不選那你的最優值就是前面的最優值即f[j](相當於從右時,他選到前面最優的情況所位於的地方)。此過程實際上是(從大到小選,即n開始)輪到某乙個人操作時,他可以選到j,也可以選到j+1等,比較j與j+1,如果他選j+1,那他的愉悅度就是a[j+1],而另外乙個人在剩餘的1~j會選出對於他最優情況(相當於他變成先手多出的最大情況),那最後總的貢獻就是a[j+1]-f[j],如果選到j,與此同理。

附**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=1e6+5;

int n,a[n],f[n],maxans;

int readint()

for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<3)+(i<<1)+ch-'0';

return i*f;

}int main()

printf("%d",maxans);

return

0;}

NOIP2017模擬 分玩具

2017.10.11 t2 1968 樣例資料 輸入3 1 3 1 輸出 分析 又是一道o n 題fffffffff!我的心理活動 第一眼,what?博弈論?noip要考這?你們既然極其聰明幹嘛讓我來算,不會,放棄。距考試結束40分鐘時,打個暴力吧。距考試結束10分鐘時,mmp連思路都沒有寫個屁屁。...

玩具裝箱(noip衝刺模擬題 DP)

1.玩具裝箱 toy.pas c cpp time limit 1000ms memory limit 256m 喜歡玩具,家裡有n個玩具,有一天,她想讓玩具們曬曬太陽,把所有的玩具都拿出來擺成一排,從左到右依次編號為1 n。每個玩具大小不一,玩具i的大小為ai。太陽下山了,開始收玩具了,現在將這些...

搜尋 模擬好題 終焉花海

首先看要輸出任何一種解 想到搜尋或者模擬 再想搜尋順序問題,發現應倒序搜尋,每次搜尋當前最後一次覆蓋的位置 這樣的話後面的搜尋就不會對前面的覆蓋產生影響 所以每次在a串裡匹配b串,把匹配位置換成 以後搜尋過程中 可按萬能位置匹配 因為一定有解,所以當a串全部變成?就覆蓋成功了 倒序輸出搜尋答案即可 ...