codeforces(牛客网dp专题,排序)
鏈接:https://ac.nowcoder.com/acm/problem/21314
來源:牛客網
牛牛正在打一場CF
比賽時間為T分鐘,有N道題,可以在比賽時間內的任意時間提交代碼
第i道題的分數為maxPoints[i],題目的分數隨著比賽的進行,每分鐘減少pointsPerMinute[i]
這是一場比較dark的Cf,分數可能減成負數
已知第i道題需要花費 requiredTime[i] 的時間解決
請問最多可以得到多少分
輸入描述:
第一行輸入兩個整數N,T (1 ≤ N ≤ 50, 1 ≤ T ≤ 100000)
第二行輸入n個整數maxPoints[i]
第三行輸入n個整數pointsPerMinute[i]
第四行輸入n個整數requiredTime[i]
1 ≤ maxPoints[i],pointsPerMinute[i],requiredTime[i] ≤ 100000
輸出描述:
輸出一個整數
示例1
輸入
復制
1 74
502
2
47
輸出
復制
408
示例2
輸入
復制
2 40000
100000 100000
1 100000
50000 30000
輸出
復制
0
示例3
輸入
復制
3 75
250 500 1000
2 4 8
25 25 25
輸出
復制
1200
示例4
輸入
復制
3 30
100 100 100000
1 1 100
15 15 30
輸出
復制
97000
備注:
子任務1: n <= 10
子任務2: n <= 20
子任務3: 無限制
很明顯的一道dp題目,但是這道題目起始dp是沒辦法dp的。首先這到題目特別像一個01背包的問題。但是每種物品的順序不同,最終獲得的份數又不同。那么應該怎么排序呢。我們假設現在有兩件物品i和j,現在已經到達了時間t1,該怎么安排這兩件物品呢?
假如先i后j,最終獲得的分數為:point[i]-(t1+x)*min[i]+point[j]-(t1+x+y)*min[j]
假如先j后i,最終獲得的分數為:point[j]-(t1+y)min[j]+point[i]-(t1+x+y)min[i]
(point[i]代表第i件物品的分數,min[i]代表著第i件物品每分鐘降低的分數,x,y代表著解決這道題目需要的時間)
兩下一作差,得到ymin[i]-xmin[j]。我們要最大化分數,所以我們要使這個差大于0。之后的問題就是01背包了。
代碼如下:
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的codeforces(牛客网dp专题,排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pots POJ - 3414(bfs)
- 下一篇: 被3整除的子序列(线性dp)