最远距离(house)

题目描述

Jimmy 想建立一条长度为 Len 的主线大街,然后建立 K 条小街,每条小街的尽头有一间房子(小街的其它位置没有房子)。每条小街在主线大街的 P_i 处分支, 小街的长度用 L_i 表示,Jimmy 想知道最远的两个房子之间的距离是多少。

输入

从文件 house.in 中读入数据。

第 1 行两个整数 Len 和 K,意义如题目描述。

第 2..K+1 行,每行两个整数 P_i 和 L_i,对应着一条小街的信息。

输出

输出到文件 house.out 中。

输出共一行一个整数,即最远的两个房子之间的距离。

样例数据
输入 #1 复制
5 4
5 6
2 2
0 3
2 7
输出 #1 复制
16
输入 #2 复制
5 4
2 4
2 2
2 10
2 7
输出 #2 复制
17
数据范围限制

对于 30% 的数据:1≤Len≤500;2≤K≤100;1≤L_i≤1,000;

对于 60% 的数据:1≤Len≤5,000;2≤K≤5,000;1≤L_i≤1,000,000;

对于 100% 的数据:1≤Len≤100,000,000;2≤K≤500,000;0≤P_i≤Len;1≤L_i≤100,000,000;

提示

样例 1 解释

主线大街长度是 5,有 4 条小街,分别位于距离主线大街 0、2、2、5 处。这 4 条小街的长度分别是 3、2、7、6。注意:主线大街的同一个地点可以有多条小街;房子#1 和房子#4 的距离最远,最远距离是 16。

这道题你可以想想,最远距离是两个小街的距离加上中间间隔的距离就行了

AC代码:

#include<bits/stdc++.h>  // 包含所有标准库头文件,简化编程
using namespace std;     // 使用标准命名空间,避免重复写std::
int myd,k,ma=INT_MIN,mi=INT_MIN;  // 定义主线长度myd、小街数量k,初始化最大/次大值为最小整数
int a[500005],b[500005],s[500005]; // 数组a存分支位置,b存小街长度,s存计算值

int main() {
    freopen("house.in","r",stdin);   // 重定向标准输入到文件house.in
    freopen("house.out","w",stdout); // 重定向标准输出到文件house.out
    scanf("%d%d",&myd,&k);          // 读取主线长度myd和小街数量k
    
    // 循环读取每条小街的分支位置a[i]和长度b[i]
    for(int i=1;i<=k;i++) {
        scanf("%d%d",&a[i],&b[i]);
    }
    
    // 计算每条小街到主线右端点的距离s[i]=a[i]+b[i],并更新最大值ma
    for(int i=1;i<=k;i++) {
        s[i]=a[i]+b[i];
        ma=max(s[i],ma);
    }
    
    // 计算次大值mi(小街到主线左端点的距离b[i]-a[i]),排除已选ma的情况
    for(int i=1;i<=k;i++) {
        if((b[i]-a[i])>mi && (b[i]-a[i])!=ma) {
            mi=b[i]-a[i];
        }
    }
    
    printf("%d",ma+mi); // 输出最远两房子的距离(ma+mi)
    return 0;           // 程序正常结束
}
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值