【问题描述】 松雅终于确定了新建旅馆的城市,她看中了该城市临海一条笔直的街道,此处风景优美,街道另一边是海滩,不允许有任何建筑。 不妨将该街道视作为一条坐标轴(x-轴),街道上已有 n 座方形建筑,它们的边平行于 x 轴,其中的一条横边的位于坐标轴上,其中心点为整数坐标。这些房子不会交叠,但可以相互挨着。 松雅所建的旅馆的横边长为 t,并且至少与一座已有的建筑相互挨着,这样她可以节省一些建设费用,当然,这座建筑的一条横边必须位于 x 轴上,房子不能交叠。 给出所有已有的建筑的中心点和横边长(忽略建筑墙体的厚度),请你帮她找出可以新建旅馆的位置有多少?
【输入形式】 输入的第一行为两个正整数 n 和 t( n、t ≤ 1000),分别该街道上已有的建筑数量以及她所建旅馆的横边长。 接下来的 n 行,每行两个整数 xi 和 ai,分别表示每座已有建筑位于坐标轴上的横边的中心点和横边长,其中,-20000 ≤ xi ≤20000,1≤ ai ≤1000。
【输出形式】 请输出可以新建旅馆的可能的位置的数量。
【样例输入1】
2 2
0 4
6 2
【样例输出1】 4
【样例输入2】
2 2
0 4
5 2
【样例输出2】 3
【样例输入3】
2 3
0 4
5 2
【样例输出3】 2
【样例说明】
【解题思路】与练习四松雅的旅馆类似,特点在于相邻已给建筑物的坐标大小关系不定,需进行排序
#include <iostream>
using namespace std;
int main()
{
int n,t,i,j,K,T,T1,k=2;
cin>>n>>t;
double*a=new double[n];
double*b=new double[n];
for(i=0;i<n;i++)
{
cin>>a[i]>>b[i];
}
for(i=1;i<n;i++)//以坐标为基准进行选择排序升序排列
{
for(j=0;j<i;j++)
{
if(a[i]<a[j])
{
T=a[i];a[i]=a[j];a[j]=T;
T1=b[i];b[i]=b[j];b[j]=T1;
}
else
continue;
}
}
for(i=1;i<n;i++)//判断临近两建筑物的相邻墙壁的坐标差值
{
if(((a[i]-b[i]/2)-(a[i-1]+b[i-1]/2))==t)
{
K=1;
}
else if(((a[i]-b[i]/2)-(a[i-1]+b[i-1]/2))>t)
{
K=2;
}
else
{
K=0;
}
k+=K;
K=0;
}
cout<<k;
return 0;
}