咸鱼了一个多月了,继续把题刷起来!
一、题目大意
题目的意思就是,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;}// 计算crosscout << len - GetCross(a, b, c - r, c + r) << endl;}return 0;
}
如果有问题,欢迎大家指正!!!