咸鱼了一个多月了,继续把题刷起来!
一、题目大意
题目的意思就是,Polycarp在Ox轴上运动,同时在Ox轴上设有基站,基站的覆盖范围是半径r,给定Polycarp运动的区间[a, b],以及基站的位置c和作用半径r,Polycarp每分钟运动一个单位长度,求在Polycarp运动的这个过程中,没有被基站覆盖的时间是多少?
二、题目思路以及AC代码
这题也就是一个简单的实现题,根本就是让你求一个区间的交集。比较简单,就直接上代码了。
#include <iostream>
using namespace std;
typedef long long ll;
// 交换x, y
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
// 获取两个区间的交集
int GetCross(int x1, int y1, int x2, int y2) {
if (x1 > y1) swap(x1, y1);
if (x2 > y2) swap(x2, y2);
// 无交叉
if (x1 >= y2 || x2 >= y1) return 0;
// 计算交叉
int x_cross = x1>x2?x1:x2;
int y_cross = y1>y2?y2:y1;
return y_cross - x_cross;
}
// 得到区间长度
int GetSectionLen(int x, int y) {
return abs(y - x);
}
int main() {
int T;
cin >> T;
while (T--) {
int a, b, c, r;
cin >> a >> b >> c >> r;
int len = GetSectionLen(a, b);
if (len == 0) {
cout << 0 << endl;
continue;
}
// 计算cross
cout << len - GetCross(a, b, c - r, c + r) << endl;
}
return 0;
}
如果有问题,欢迎大家指正!!!
来源:CSDN
作者:顺其灬自然丨
链接:https://blog.csdn.net/m0_38055352/article/details/103726020