原题传送门:Young Photographer
一、本题的思路
我们先把题目抽象化:给定一堆区间,假如它们交为空,则输出 − 1 -1 −1,否则输出一个定点走进这个区间所需的最小距离。这样一来,我们的步骤也变得明确了:
1. 读出区间的交集
for (int i = 1; i <= n; i++)
{
cin >> a >> b;
start[i] = min(a, b); // 每一个的起点
end[i] = max(a, b); // 终点
if (start[i] > startmax) // 最靠右的起点
startmax = start[i];
if (end[i] < endmin) // 最靠左的终点
endmin = end[i];
}
2. 走进这个区间所需的最小距离
if (startmax <= pos && pos <= endmin) // 在里面
cout << 0;
else
{
if (pos < startmax) // 在左边
cout << (startmax - pos);
else // 在右边
{
cout << (pos - endmin);
}
}
二、完整代码
#include <iostream>
using namespace std;
int main()
{
int n, pos, start[105], end[105], a, b;
int startmax = -1, endmin = 9999;
cin >> n >> pos;
for (int i = 1; i <= n; i++)
{
cin >> a >> b;
start[i] = min(a, b);
end[i] = max(a, b);
if (start[i] > startmax)
startmax = start[i];
if (end[i] < endmin)
endmin = end[i];
}
if (endmin < startmax)
cout << -1;
else
{
if (startmax <= pos && pos <= endmin)
cout << 0;
else
{
if (pos < startmax)
cout << (startmax - pos);
else
{
cout << (pos - endmin);
}
}
}
return 0;
}