2020百度之星初賽第二場 Solo(博弈DP)

2021-10-09 05:50:34 字數 2965 閱讀 1026

problem description

alice 和 bob 準備 solo 一場演算法競賽。

比賽一共有 nn 個題,編號為 1,2…,n1,2…,n,對於第 ii 道題,alice 需要 a[i]a[i] 分鐘寫出乙份正確的**,bob 需要 b[i]b[i] 分鐘寫出乙份正確的**。

比賽規則為

每道題第乙個通過的人積 1 分,如果兩人同時 ac 該題,只有 alice 得分。

比賽時長為 10 ^ 10

18分鐘。

alice 和 bob 的比賽策略都滿足:決定要去做某道題後,會一直解決該題,直到自己或者對手 ac 此題,如果對手 ac 該題,則會立即放棄這題。

bob 寫完乙份正確的**後會立即提交,但 alice 寫完乙份正確的**,可以先暫時不交題,等之後再交(交題的時間忽略不計,任何時間都可以交題)。

另外 alice 知道 bob 是按 1,2,…,n1,2,…,n 的順序來依次做題,知道每道題自己需要的時間和 bob 需要的時間(即 aa 序列和 bb 序列)。

輸出 alice 最優策略下最多得幾分。

alice 和 bob 想題都不需要時間。

input

第一行乙個整數 t(1 \leq t \leq 10)t(1≤t≤10) 表示 tt 組資料。

每組資料第一行乙個整數 n (1 \leq n \leq 2000)n(1≤n≤2000) 表示題數。

第二行 nn 個整數,表示 a[1],a[2],…a[n](1 \leq a[i] \leq 1000000000)a[1],a[2],…an。

第三行 nn 個整數,表示 b[1],b[2],…b[n](1 \leq b[i] \leq 1000000000)b[1],b[2],…bn。

保證至多只有一組資料 n>100n>100。

output

對於每組資料,一行乙個整數表示答案。

sample input26

6 6 6 6 6 6

1 1 1 1 1 1

31 2 3

5 1 1

sample output13

樣例解釋

case 1 開場直接 rush 最後一題。

case 2 [0,1) 寫掉第一題,第 5 分鐘交;[1,3) 寫第二題第 6 分鐘交,[3,6) 寫第三題第 6 分鐘交。

思路:

博弈dp個人感覺都是最後都得歸結到乙個人的決策上去。

本題的b實際就可以當做他是一直在寫題,因為a題寫完前面的題可以囤起來,等b剛好寫完的時候再交。

考慮只有一道題,如果a[1

]≤b[

1]

a[1]≤b[1]

a[1]≤b

[1],a就可以拿到1分,否則0分。

考慮只有兩道題,如果a[1

]+a[

2]≤b

[1]+

b[2]

a[1]+a[2]≤b[1]+b[2]

a[1]+a

[2]≤

b[1]

+b[2

],則a可以拿到兩分。如果a[2

]≤b[

1]+b

[2

]a[2]≤b[1]+b[2]

a[2]≤b

[1]+

b[2]

或者a [1

]≤b[

1]

a[1]≤b[1]

a[1]≤b

[1]或者,則可以拿到1分。否則拿不到分。

所以問題可以簡化為前i道題,a題可以寫掉哪些題。那麼轉移就是對於第i

ii道題寫或者不寫。

則可以定義f[i

][j]

f[i][j]

f[i][j

]為前i道題a可以拿j道題分的最小時間。那麼只要f[i

−1][

j−1]

+a[i

]≤b[

1]+.

..+b

[i

]f[i-1][j-1]+a[i]≤b[1]+...+b[i]

f[i−1]

[j−1

]+a[

i]≤b

[1]+

...+

b[i]

,那就可以拿到第i

ii道題的分。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

const

int maxn =

2e3+7;

const ll inf =

0x3f3f3f3f3f3f3f3f

;ll f[maxn]

[maxn]

;ll a[maxn]

,b[maxn]

;ll sum[maxn]

;int

main()

for(

int i =

1;i <= n;i++

)memset

(f,0x3f

,sizeof

(f))

;for

(int i =

0;i <= n;i++

)for

(int i =

1;i <= n;i++

) f[i]

[j]=

min(f[i]

[j],f[i -1]

[j]);}

}for

(int i = n;i >=

0;i--)}

}return0;

}

百度之星 初賽第二場 B題

怎麼說呢,只能說自己還不夠熟練,能力還不夠,細心成都還不夠吧。這樣的二分題目在poj的訓練計畫裡面有類似的題目,自己也是都刷了,可是在調這道題目的時候廢了老大的盡了,比賽結束後聽polla的一句思路 找出最大的t,如果按t分類,可分出1組,按0分類分出n組,二分列舉t然後利用並查集判斷分出多少種類。...

2019百度之星第二場初賽 A, B, C

a 度度熊與數字 直接暴力列舉v的因子 找到答案之後對答案排一下序輸出即可 include define ll long long using namespace std const int maxn 1005 int arr 1000 int arrr 1000 int factor int n ...

百度之星 初賽第二場 B題

怎麼說呢,只能說自己還不夠熟練,能力還不夠,細心成都還不夠吧。這樣的二分題目在poj的訓練計畫裡面有類似的題目,自己也是都刷了,可是在調這道題目的時候廢了老大的盡了,比賽結束後聽polla的一句思路 找出最大的t,如果按t分類,可分出1組,按0分類分出n組,二分列舉t然後利用並查集判斷分出多少種類。...