• [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: 无限制
    题意:给出一些任务,每个任务都有一个初始分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
    ",ans);
    35     return 0;
    36 }
    View Code
  • 相关阅读:
    JAVA_基础集合List接口与Set接口(二)
    JAVA_基础集合Collection接口与Iterator迭代器(一)
    JAVA_基础注解的概念
    JAVA_基础多线程的生命周期、线程安全、线程锁、线程通信与创建线程(二)
    JAVA_基础多线程(一)
    JAVA_基础异常概述与异常体系的结构
    JAVA_基础内部类
    JAVA_基础面向对象:接口
    Golang 学习资源
    go语言-异常处理机制-panic和recover的使用和原理
  • 原文地址:https://www.cnblogs.com/MekakuCityActor/p/10826388.html
Copyright © 2020-2023  润新知