日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codeforces(牛客网dp专题,排序)

發布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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背包了。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=51; const int maxm=1e5+100; struct node{ll point;ll mint;ll time;friend bool operator <(const node a,const node b){return b.time*a.mint>a.time*b.mint;//如此排序} }p[maxx]; ll dp[maxm]; //要開long long int n,t;int main() {while(~scanf("%d%d",&n,&t)){for(int i=1;i<=n;i++) scanf("%lld",&p[i].point);for(int i=1;i<=n;i++) scanf("%lld",&p[i].mint);for(int i=1;i<=n;i++) scanf("%lld",&p[i].time);sort(p+1,p+1+n);memset(dp,0,sizeof(dp));ll _max=0;for(int i=1;i<=n;i++){for(int j=t;j>=p[i].time;j--){dp[j]=max(dp[j],dp[j-p[i].time]+(p[i].point-(ll)(j)*(ll)p[i].mint));//這里相當于枚舉這個問題解決的時間_max=max(_max,dp[j]);//不斷的記錄最大值。}}printf("%lld\n",_max);} }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的codeforces(牛客网dp专题,排序)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。