常州大学新生寒假训练会试 D 训练技巧【dp + 单调队列优化】

题目描述

常州大学组织了新生寒假训练一共N天,每天训练可以获得的训练效果是Ei。但是如果连续训练超过K天,萌新们会受不了而被劝退。
现在负责人想知道,如何安排能保证萌新不会被劝退并且能获得最大的训练效果。

输入描述:

第一行:两个用空格隔开的整数:N和K,1≤N≤100000,1≤K≤N
第二行到N+1行:第i+1行有一个整数,表示第N天的训练效果是Ei,(0 <= Ei <= 1,000,000,000)

输出描述:

第一行:单个整数,表示最大的能力之和

示例1

输入

5 2
1
2
3
4
5

输出

12

说明

(除了第三天以外每天都在训练,总训练效果为1+2+4+5=12)

备注:

1≤n≤100,000

题意 : 略

分析: 这题算是很经典的单调队列优化的了,仔细说下吧,dp[i] 表示不取第i天,损失最小的收益,这个可能一开始有点不好理解吧,模拟下就ok了,我们来维护一个递增的单调队列,从而我们可以再O(1)的时间里找到最近k天,损失最少的收益,这样动态方程就为:
当 i > k 时:dp[i] = a[i] + dp[q.front()];
否则:dp[i] = a[i]

然后维护一个长度为 k 的单调队列即可

参考代码

#include<bits/stdc++.h>

using namespace std;

#define ll long long
const ll INF_LL = 9223372036854775807LL;

const ll maxn = 1e5 + 10;

ll a[maxn];
ll dp[maxn];

int main(){
    int n,k;
    while (scanf("%d%d",&n,&k) == 2) {
        memset (dp,0,sizeof dp);
        ll sum = 0;
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
            sum += a[i];
        }
        deque<int> q;
        for (int i = 0; i < n; i++) {
            if (i > k) dp[i] = a[i] + dp[q.front()];
            else dp[i] = a[i];
            while(!q.empty() && dp[q.back()] > dp[i]) {
                q.pop_back();
            }
            q.push_back(i);
            if(i - q.front() > k) q.pop_front();
        }
        ll mi = INF_LL;
        for (int i = n - k - 1; i < n; i++) {
            mi = min(dp[i],mi);
        }
        printf("%lld\n",sum - mi);
    }
    return 0;
}
  • 如有错误或遗漏,请私聊下UP,thx
利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值