链接:https://ac.nowcoder.com/acm/problem/21314
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
牛牛正在打一场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: 无限制
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll p,m,t;//最高得分,每分钟减少,需要时间
}a[55];
bool cmp(node a,node b){
return a.t*b.m<b.t*a.m;
}
ll dp[100005];//dp[i]做到i分钟所能得到的最大分数
int main(){
int n,T;
scanf("%d%d",&n,&T);
for(int i=1;i<=n;i++) scanf("%lld",&a[i].p);
for(int i=1;i<=n;i++) scanf("%lld",&a[i].m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i].t);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
for(int j=T;j>=a[i].t;j--){
dp[j]=max(dp[j],dp[j-a[i].t]+a[i].p-j*a[i].m);
}
}
ll ans=0;
for(int i=1;i<=T;i++) ans=max(dp[i],ans);
printf("%lld\n",ans);
return 0;
}