列表

详情


NC248197. 障碍

描述

在数轴上的 区间,有 m 个障碍位于区间内的若干个整点坐标,将 区间分隔成了若干段。

如上图所示,红色表示障碍, 区间被三个障碍分隔形成了四段:,它们的长度分别为:3,3,3,1

现在可以从中移除任意多个障碍,称移除的障碍数量为 x,并称此时区间 内最长段的长度为 L

请最大化 的值,输出这个值。

输入描述

第一行输入两个正整数 ,分别表示区间的右端点和障碍的数量。

第二行输入 m 个互不相同的正整数 以空格相隔,第 i 个正整数 a_i 表示第 i 个障碍的位置。

输出描述

第一行输出一个整数,表示答案。

示例1

输入:

10 3
3 6 9

输出:

5

说明:


移除第二个障碍 a_i=6,此时 L=9-3=6(即第一个障碍与第三个障碍之间的区间长度),x=1^2=1,答案即 6-1=5

可以发现,这是最优的情况。

示例2

输入:

3 3
1 2 3

输出:

1

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 70ms, 内存消耗: 1452K, 提交时间: 2023-03-12 21:44:29

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int main(){
	int n,m,a[N],i,sum=0,l;
	scanf("%d%d",&n,&m);
	a[0]=0;
	for(i=1;i<=m;i++){
		scanf("%d",&a[i]);
	}
	a[m+1]=n;
	int k=sqrt(n);
	for(l=0;l<=k;l++){
		for(i=1;i+l<=m+1;i++){
			sum=max(sum,a[i+l]-a[i-1]-l*l);
		}
	}
	printf("%d",sum);
}

C++(clang++ 11.0.1) 解法, 执行用时: 53ms, 内存消耗: 796K, 提交时间: 2023-05-02 13:49:02

#include<bits/stdc++.h>
using namespace std;
int a[200010];
int main()
{
	int  n,m;cin>>n>>m;
	for(int i=1;i<=m;i++) cin>>a[i];
	a[++m]=n;
	int s=0;
	for(int i=0;i<min(500,m);i++)
	{
		for(int j=i+1;j<=m;j++)
			s=max(s,a[j]-a[j-i-1]-i*i);
	}
	cout<<s<<endl;
	return 0;
}

pypy3 解法, 执行用时: 303ms, 内存消耗: 32012K, 提交时间: 2023-02-10 23:32:04

n,m=map(int,input().split())
A=list(map(int,input().split()))
A=[0]+A
A.append(n)
ret=0
for i in range(1,501):
    if i-1>m:
        break
    for j in range(0,m+2-i):
        ret=max(ret,A[j+i]-A[j]-(i-1)**2)
print(ret)

上一题