列表

详情


NC210357. 选择

描述

由于一些原因, Cubercsl 又送了 Compute 一个长度为 n 的数组。

但是 Cubercsl 的兴趣很奇怪,他要求 Compute 从中选恰好  个才能拿走,并且不能选择在数组中相邻的数。

同时,Compute 也有着奇怪的癖好 --- 他一定会选择第 x 个数。

既然能拿,Compute 当然想要越多越好。即他想知道,他能拿走的数的和最大是多少。

输入描述

第一行输入两个数 n,x (, ),表示数组的长度和 Compute 一定会选的数的位置。

第二行输入 n 个整数 (),中间以空格分割。

输出描述

在一行中输出一个整数,表示 Compute 能拿走的数的和的最大值。

示例1

输入:

6 1
1 2 3 4 5 6

输出:

11

示例2

输入:

5 3
-1000000000 -1000000 -1000 0 1000000000

输出:

999999000

原站题解

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

C++14(g++5.4) 解法, 执行用时: 50ms, 内存消耗: 5072K, 提交时间: 2020-08-06 02:16:02

#include<bits/stdc++.h>
using namespace std;

long long R[200005],DP[200005],S[200005],INF=1e16;
int main()
{
    int i,n,t;
	scanf("%d%d",&n,&t);
    for(i=1;i<=n;i++)scanf("%lld",&R[i]);
    R[t]+=INF,S[1]=R[1];
    for(i=3;i<=n;i+=2)S[i]=S[i-2]+R[i];
    for(i=2;i<=n;i++)
    {
    	if(i&1)DP[i]=max(DP[i-1],DP[i-2]+R[i]);
    	else DP[i]=max(S[i-1],DP[i-2]+R[i]);
	}
    printf("%lld\n",DP[n]-INF);
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 80ms, 内存消耗: 7240K, 提交时间: 2020-08-06 10:22:43

#include<bits/stdc++.h>
#define N 200005
using namespace std;
long long a[N],dp[N],s[N],p=1e16;
int main(){
	int n,x,i;cin>>n>>x;
	for(i=1;i<=n;i++)cin>>a[i];
	a[x]+=p;s[1]=a[1];
	for(i=3;i<=n;i+=2)s[i]=s[i-2]+a[i];
	for(i=2;i<=n;i++)
	if(i&1)dp[i]=max(dp[i-1],dp[i-2]+a[i]);
	else dp[i]=max(dp[i-2]+a[i],s[i-1]);
	cout<<dp[n]-p;
}

上一题