列表

详情


NC217894. 建立火车站

描述

新冠疫情,导致了各个城市之间物资输送的障碍。假设有N个城市在一条直线上,为了物资能顺利抵达各个城市,可以在路线上建立最多个数为K个暂时停靠站,由于火车在两个站台(城市也算站台)之间的距离越近,需要的总花费越少,因此我们需要让火车相邻两个站台之间的最大距离最小,求出距离L,2 ≤N ≤100000, 0 ≤K ≤100000,所有城市坐标小于等于10^12,且不存在负值。提醒: 城市坐标均为正整数,且停靠站只能建在整数坐标点上。

输入描述

第一行输入城市个数N,可建立停靠站个数K, 第二行输入N个城市的坐标(不保证前一个城市坐标比后一个城市小)。 

输出描述

输出L

示例1

输入:

2 2
4 106

输出:

34

原站题解

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

pypy3(pypy3.6.1) 解法, 执行用时: 203ms, 内存消耗: 39988K, 提交时间: 2021-02-06 22:55:26

n, k = [int(x) for x in input().split()]
pos = sorted(int(x) for x in input().split())
l, r = 1, 1000000000000
ans = r

def check(itv: int) -> bool:
    cnt = 0
    for i in range(1, n):
        dis = pos[i] - pos[i - 1]
        cnt += dis // itv - (0 if dis % itv > 0 else 1)
    return cnt <= k

while l <= r:
    mid = l + r >> 1
    if check(mid):
        r = mid - 1
        ans = mid
    else:
        l = mid + 1
print(ans)

Python3(3.9) 解法, 执行用时: 1096ms, 内存消耗: 13840K, 提交时间: 2021-02-06 22:57:26

n, k = [int(x) for x in input().split()]
pos = sorted(int(x) for x in input().split())
l = 1
ans = r = 1000000000000

def check(itv: int) -> bool:
    cnt = 0
    for i in range(1, n):
        dis = pos[i] - pos[i - 1]
        cnt += dis // itv - (0 if dis % itv > 0 else 1)
    return cnt <= k

while l <= r:
    if check((mid := l + r >> 1)):
        r = (ans := mid) - 1
    else:
        l = mid + 1
print(ans)

C++(clang++11) 解法, 执行用时: 56ms, 内存消耗: 2060K, 提交时间: 2021-02-01 11:44:10

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010];
ll n,k,t;
int bs(ll l,ll r)
{
	ll mid=l+r>>1;
	if(l==r)
	return l;
	ll sum=0,i;
	for(i=1;i<n;i++)
	{
		sum+=(a[i]-a[i-1]-1)/mid;
	}
	if(sum>k)
	return bs(mid+1,r);
	return bs(l,mid); 
}
int main()
{
	int i,j;
	cin>>n>>k;
	for(i=0;i<n;i++)
	cin>>a[i];
	sort(a,a+n);
	cout<<bs(1,1e12); 
}

上一题