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)