P2034选择数字题解

题目链接:在这里~

题目描述:

给定一行n个非负整数a[1]..a[n]。现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择。你的任务是使得选出的数字的和最大。

输入格式:

第一行两个整数n,k

以下n行,每行一个整数表示a[i]。

输出格式:

输出一个值表示答案。

思路:考虑反面,不能有超过k个连续的数字被选,等价于连续的k+1个数字中必须删一个,考虑如何去删数字,f[i]表示删了第i个数字的最小代价,f[i]可由(i-k-1)--->(i-1)转移过来,即在i前面的k+1个数字间,必须删一个,且 当前决策对后面无影响。n=1e5,O(n^2)的算法是过不去的,所以可以单调队列优化。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define R register
#define ll long long int
using namespace std;
const int N=1e5+5;
ll n,k,a[N],f[N],Min=1e16,fir=1,x[N],ans,head=1,tail=0;
int main(){
    scanf("%lld%lld",&n,&k);
    for(R int i=1;i<=n;++i){
    scanf("%lld",&a[i]);
    ans+=a[i];f[i]=Min;
    }
    f[0]=0;//第i个被删的最小代价
    for(R int i=1;i<=n;++i){
        if(i<=k+1)
        f[i]=a[i];
        else
        f[i]=f[x[head]]+a[i];
        while(head<=tail&&x[head]<i-k)head++;
        while(head<=tail&&f[x[tail]]>f[i])tail--;
        x[++tail]=i;
    }
    for(R int i=n;i>=n-k;--i)
    Min=min(Min,f[i]);
    printf("%lld",ans-Min);
    return 0;
}

原文地址:https://www.cnblogs.com/sky-zxz/p/9785130.html

时间: 2024-08-29 20:29:55

P2034选择数字题解的相关文章

codevs3327选择数字(单调队列优化)

3327 选择数字 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input Description 第一行两个整数n,k 以下n行,每行一个整数表示a[i]. 输出描述 Output Description 输出一个值表示答案. 样例输入 Sample Input 5 2

为什么 String hashCode 方法选择数字31作为乘子

参考文章: hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法 https://www.jianshu.com/p/76c5215eda5c 为什么 String hashCode 方法选择数字31作为乘子 https://segmentfault.com/a/1190000010799123 为什么在定义hashcode时要使用31这个数呢? https://blog.csdn.net/mingli198611/article/details/10062791

选择数字

题目描述 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入输出格式 输入格式: 第一行两个整数n,k 以下n行,每行一个整数表示a[i]. 输出格式: 输出一个值表示答案. 输入输出样例 输入样例#1: 5 2 1 2 3 4 5 输出样例#1: 12 说明 对于20%的数据,n <= 10 对于另外20%的数据, k = 1 对于60%的数据,n <= 1000 对于100%的数据,1 <=

选择数字(codevs 3327)

题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input Description 第一行两个整数n,k 以下n行,每行一个整数表示a[i]. 输出描述 Output Description 输出一个值表示答案. 样例输入 Sample Input 5 2 1 2 3 4 5 样例输出 Sample Output 12 数据范围及提示 Data Size & H

洛谷 P1311 选择客栈 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1311 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费. 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中.晚上,

BZOJ4568:[SCOI2016]幸运数字——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=4568 https://www.luogu.org/problemnew/show/P3292 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征. 一些旅行者希望游览 A 国.旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y

如何选择数字货币交易所?

链塔智库做了一个主流数字货币交易所的安全性评级,比较客观,具有较高的参考价值.(全文见公众号 比特量化)综合该评级分析,加上我们对市场的一些理解,对于国内中文用户,做出如下结论: 1.国内中文用户首选 火币 和 币安:2.次选OKEx,ZB,Gate.io,Bitfinex:3.未进入本次评级的交易所不建议选择. 原文地址:https://www.cnblogs.com/fangbei/p/9098399.html

NOIP2011 选择客栈 题解(最简方法,超短代码)

描述 丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号.每家客栈都按照某一种色调进行装饰(总共k种,用整数0~ k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费. 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中.晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p. 他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p

剑指offer 面试题8:旋转数组的最小数字 题解

面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个已从小到大排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.(要求不能直接遍历数组来求解.) 提交网址: http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159 或 http: