松雅的新旅馆

【问题描述】

      松雅终于确定了新建旅馆的城市,她看中了该城市临海一条笔直的街道,此处风景优美,街道另一边是海滩,不允许有任何建筑。

      不妨将该街道视作为一条坐标轴(x-轴),街道上已有 n 座方形建筑,它们的边平行于 x 轴,其中的一条横边的位于坐标轴上,其中心点为整数坐标。这些房子不会交叠,但可以相互挨着。

      松雅所建的旅馆的横边长为 t,并且至少与一座已有的建筑相互挨着,这样她可以节省一些建设费用,当然,这座建筑的一条横边必须位于 x 轴上,房子不能交叠。

      给出所有已有的建筑的中心点和横边长(忽略建筑墙体的厚度),请你帮她找出可以新建旅馆的位置有多少?

【输入形式】

      输入的第一行为两个正整数 n 和 t( nt ≤ 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

【样例说明】

注意,新建房子的中心坐标可能为非整数,输入的相邻xi 之间的大小关系不确定。

#include
#include
#include
#include
#include
using namespace std;
//松雅的新旅馆

int main()
{
	int n, t, cnt = 2;
	cin >> n >> t;
	double x[100], a[100];
	double interval;
	for (int i = 0; i < n; i++)
	{
		cin >> x[i] >> a[i];
	}
	double temp;
	for (int j = 0; j < n; j++)
	{
		
		for (int i = 0; i <= j; i++)
		{
			if (x[i] > x[j]) 
			{ 
				temp = x[j]; x[j] = x[i]; x[i] = temp;
				temp = a[j]; a[j] = a[i]; a[i] = temp;
			}
		}
		
	}
	for (int i = 0; i < n - 1; i++)
	{
		interval =abs(x[i + 1] - x[i]) - (a[i] + a[i + 1]) / 2;
		if (interval == t ) cnt++;
		else if (interval > t ) cnt += 2;
	}
	cout << cnt << endl;
	system("pause");
	return 0;
}

double temp;

for (int j = 0; j < n; j++)//对x[j]
{      
        for (int i = 0; i <= j; i++)//遍历0 - j
        {
                if (x[i] > x[j]) //如果有x[i]>x[j],互换使x[j]保持最大
                {

                        temp = x[j]; x[j] = x[i]; x[i] = temp;
                        temp = a[j]; a[j] = a[i]; a[i] = temp;
                 }

         }  
    }
  //数组排序

你可能感兴趣的:(练习,c++)