CF1282A 题解

洛谷链接&CF 链接

题目简述

共有 \(T\) 组数据。

有一条数轴,要从 \(a\) 点跑到 \(b\) 点,在 \(c\) 点的地方有网络,覆盖区间为 \([c - r, c+ r]\),问在多少时间没有网络覆盖。

思路

分类讨论:

  1. \(c + r \le a\)\(c - r \ge b\),表示区间 \([a, b]\) 内都没有网络,直接输出 \(b - a\)

  2. \(c + r \ge b\)\(c - r \ge a\),表示区间 \([c - r, b]\) 区间有网络,输出 \(c - r - a\)

  3. \(c - r \le a\)\(c + r \le b\),表示区间 \([a, c + r]\) 有网络,输出 \(b - c - r\)

  4. \(c + r \ge b\)\(c - r \le a\),表示区间 \([a, b]\) 内都有网络,输出 \(0\) 即可。

  5. \(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!} \]

posted @ 2023-08-02 16:34  So_noSlack  阅读(22)  评论(0编辑  收藏  举报