列表

详情


NC23804. DongDong跳一跳

描述

DongDong有一只超可爱的英短喜欢跳一跳,但此跳一跳非彼跳一跳

n根柱子,每根柱子都有一个高度和柱子上面鱼干的数量,英短开始的时候可以选择站在任意一根柱子上,每次跳跃不限长度而且只能从左向右跳跃,但只能跳到高度与当前所站高度差绝对值小于等于m的柱子上,英短可贪心了,想吃最多的鱼干,请你设计一个程序能让英短吃到最多的鱼干(最终不一定要落在第n根柱子上)。

输入描述

第一行给定两个整数,n,m

接下来n行,每行x,y表示这根柱子高度为x,上面有y根鱼干

数据范围:1<=n<=200000,1<=m<=500,对于每根柱子的x,y,1<=x<=1000000,1<=y<=1000000

输出描述

输出英短最多可以吃到多少鱼干

示例1

输入:

4 4
1 0
2 100
100 5
6 10

输出:

110

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 222ms, 内存消耗: 3540K, 提交时间: 2019-06-10 14:39:32

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll dp[1000505];
int main()
{
    int n, m;
    ll ans=0;
    scanf("%d%d", &n, &m);
    for (int i=0;i<n;i++)
    {
        int h,v;
        scanf("%d%d",&h,&v);
        dp[h]+=v;
        ans=max(ans,dp[h]);
        for (int j=max(1,h-m);j<=h+m;j++)
            dp[j]=max(dp[j],dp[h]);
    }
    printf("%lld",ans);
}

C++ 解法, 执行用时: 245ms, 内存消耗: 680K, 提交时间: 2022-02-28 21:01:19

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
ll dp[N];
int main()
{
	int n,m,x,y;
	ll ans=0;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	{
		cin>>x>>y;
		dp[x]+=y;
		ans=max(dp[x],ans);
		for(int j=max(1,x-m);j<=x+m;j++)
		{
			dp[j]=max(dp[j],dp[x]);
		}
	}
	cout<<ans<<endl;
	return 0;
}

上一题