NOIP2017模擬 分玩具

2021-08-09 05:39:49 字數 1534 閱讀 3205

2017.10.11 t2 1968

樣例資料

輸入

3

1 3 1

輸出

分析:又是一道o(n)題fffffffff!!!我的心理活動:第一眼,what?博弈論?noip要考這?你們既然極其聰明幹嘛讓我來算,不會,放棄。距考試結束40分鐘時,打個暴力吧。距考試結束10分鐘時,mmp連思路都沒有寫個屁屁。考完看題解,什麼?dp?好像很有道理!現在,媽耶終於弄懂在dp個啥了,而且腦子裡還有點漿糊……

是這樣的,因為每次拿掉一些後,對於下乙個人,又是乙個從一堆中拿對自己最有利的玩具的子問題,所以可以dp(這一點拿到題解就覺得非常有道理)。dp[i]表示如果一次性拿到第i大的玩具的最大差值,因為我們只知道一次性取完的dp[i],就只好反過來遞推,把所有玩具的好玩值sort一下,我們對於當前玩具有遞推方程:dp[i]=max(dp[i-1],a[i]-dp[i-1]),也就是拿到這乙個玩具還是拿到後面的玩具(在陣列裡就是dp[i-1],因為後面的最優值已經更新到dp[i-1]裡了)更優(a[i]-dp[i-1]意思是你如果拿到a[i],下乙個人在做子問題的時候就可以做到和你的差值為dp[i-1],也就是說你只能做到a[i]-dp[i-1]的差值,也可以理解為別人和你已經拉開了dp[i-1]的差距,你現在又能夠多a[i]的愉悅度,用它補完差距剩下的就是你的差值)。

舉個例子:

現在有兩個玩具1、3

那麼sort之後就是1、3

dp[1]=a[1]=1,dp[2]=max(a[1],a[2]-dp[1])

也就是說一次性拿完兩人之差就是1,而如果只拿3,那麼兩人之差就是3-1=2,果斷選拿3啊。

大概是這樣,考試的時候怎麼想得到嘛,於是,我又吐槽:

哈哈哈,小小的娛樂一下。

**

這麼短我都想打人!

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int getint()

for(;isdigit(ch);ch=getchar())

sum=(sum<<3)+(sum<<1)+ch-48;

return sum*f;

}const

int maxn=1000010;

int a[maxn],dp[maxn];

int n;

int main()

本題結。

NOIP2017模擬 鴨舌

題目 小美喜歡吃鴨舌。有乙個 n 個點的樹,每個節點 i 第 i 個點上有 ai 個鴨舌。小美一開始處於 x 號點。每次小美可以選擇乙個與現在的點有邊的點而且那個點還有鴨舌,那麼小美會走到那個點並吃乙個鴨舌。要保證小美最後還是走到 x 號點。問小美最多能吃幾個鴨舌?輸入格式 輸入第一行乙個整數 n ...

NOIP2017模擬 區間

2017.11.3 t1 2032 樣例資料 輸入3 2 1 2 1 1 2 4 5輸出 2 6分析 這道題為什麼要放在t1 考得我懷疑人生。本來也只會暴力找,對於30 的資料我是這樣的 先離散化,再二維陣列記錄所有顏色的在每個位置的字首和,然後四層迴圈暴力查詢。而正解是 先離散化,再把每種顏色的每...

NOIP2017模擬 舉辦比賽

2017.8.27 t1 1946 樣例資料1 輸入5 5 1 2 3 4 5 輸出 樣例資料2 輸入10000000 10000000 555 888 777 666 12345 輸出 分析 第一次做這種隨機概率題 看到資料那麼大o n 的做法根本想不到就直接放棄了。結果就是個撞運氣的ffffff...