[codeforces][dp]

it2022-05-05  153

链接: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: 无限制题意:给出一些任务,每个任务都有一个初始分ai,每分钟会降低bi(可以降低到负分),完成这个任务需要花费ci分钟,求最多可以得到的分数题解:容易看出是个dp,又由于bi影响着ai每个时刻的值,所以做任务的顺序影响着dp结果,想要得到最优的dp结果就需要进行排序,假设有两个任务1和2,那么二者可以得到的分数为如果先做1,则=a1+a2-b1*c1-b2*(c1+c2),如果先做2,则=a1+a2-b2*c2-b1*(c1+c2),则排序条件就应该是a1+a2-b1*c1-b2*(c1+c2)>a1+a2-b2*c2-b1*(c1+c2) 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 struct pot{ 5 ll q; 6 ll w; 7 ll e; 8 }p[55]; 9 bool cmp(struct pot aa,struct pot bb){ 10 return (aa.e+bb.e)*bb.w+aa.e*aa.w<(aa.e+bb.e)*aa.w+bb.e*bb.w; 11 } 12 ll dp[100005]; 13 int main() 14 { 15 ll n,t; 16 scanf("%lld%lld",&n,&t); 17 for(int i=1;i<=n;i++){ 18 scanf("%lld",&p[i].q); 19 } 20 for(int i=1;i<=n;i++){ 21 scanf("%lld",&p[i].w); 22 } 23 for(int i=1;i<=n;i++){ 24 scanf("%lld",&p[i].e); 25 } 26 ll ans=0; 27 sort(p+1,p+1+n,cmp); 28 for(int i=1;i<=n;i++){ 29 for(int j=t;j>=p[i].e;j--){ 30 dp[j]=max(dp[j],dp[j-p[i].e]+p[i].q-(p[i].w)*(j)); 31 ans=max(ans,dp[j]); 32 } 33 } 34 printf("%lld\n",ans); 35 return 0; 36 } View Code

 

转载于:https://www.cnblogs.com/MekakuCityActor/p/10826388.html


最新回复(0)