题目描述
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; // 程序正常结束
}
1080

被折叠的 条评论
为什么被折叠?



