技巧总结
- 计算两个区间的交集 :右区间的最小值减去左区间的最大值
- 有的问题合在一起考虑会有很多种情况,但是单个单个的解决似乎更妙,比如:一个区间一个区间的计算
解题思路
由于一个人装菜的时间区间都互不相交,所以可以枚举A的每一个区间与B所有区间的所有交集,进行累加
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2020;
#define x first
#define y second
typedef pair <int, int> PII;
PII p[N], q[N];
int n;
int intersect(PII a, PII b) //计算两个区间的交集
{
if (a.x > b. y || a. y < b.x) return 0;
return (min(a.y, b.y) - max(a.x, b.x)); //右区间的最小值减去左区间的最大值
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++) cin >> p[i].x >> p[i].y;
for (int i = 0; i < n; i ++) cin >> q[i].x >> q[i].y;
int res = 0;
for (int i = 0; i < n; i ++) //枚举p的每一个区间与q的所有交集
{
for (int j = 0; j < n; j ++)
{
res += intersect(p[i], q[j]); //计算这两个区间的交集
}
}
cout << res;
return 0;
}