CF1282A 题解
题目简述
共有 \(T\) 组数据。
有一条数轴,要从 \(a\) 点跑到 \(b\) 点,在 \(c\) 点的地方有网络,覆盖区间为 \([c - r, c+ r]\),问在多少时间没有网络覆盖。
思路
分类讨论:
-
\(c + r \le a\) 或 \(c - r \ge b\),表示区间 \([a, b]\) 内都没有网络,直接输出 \(b - a\)。
-
\(c + r \ge b\) 且 \(c - r \ge a\),表示区间 \([c - r, b]\) 区间有网络,输出 \(c - r - a\)。
-
\(c - r \le a\) 且 \(c + r \le b\),表示区间 \([a, c + r]\) 有网络,输出 \(b - c - r\)。
-
\(c + r \ge b\) 且 \(c - r \le a\),表示区间 \([a, b]\) 内都有网络,输出 \(0\) 即可。
-
\(c + r \le b\) 且 \(c - r \ge a\),表示区间 \([c - 1, c + r]\) 有网络,正常输出 \(b - a - 2 \times r\) 即可。
那么代码就很好实现了:
#include<iostream>
using namespace std;
int T, a, b, c, r;
int main(){
cin >> T;
while(T --) {
cin >> a >> b >> c >> r;
if(a > b) swap(a, b); // 保证 a <= b
if(c + r <= a || c - r >= b) cout << b - a << endl; // 情况 1
else if(c + r >= b && c - r >= a) cout << c - r - a << endl; // 情况 2
else if(c - r <= a && c + r <= b) cout << b - c - r << endl; // 情况 3
else if(c + r >= b && c - r <= a) cout << 0 << endl; // 情况 4
else cout << b - a - 2 * r << endl; // 情况 5
}
return 0;
}
\[\text{The End!}
\]
本文来自博客园,作者:So_noSlack,转载请注明原文链接:https://www.cnblogs.com/So-noSlack/p/17601075.html