问题描述
思路
首先注意,每个人的输入数据是已经排好序的,按题目要求进行模拟即可,代码中有详细解释
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct time
{
int s;
int e;
};
int main()
{
int n,x,y,end,st;
long long int res=0;
cin>>n;
vector <time> a(n);
vector <time> b(n);
for(int i=0;i<n;i++) {
cin>>x>>y;
a[i].s=x;
a[i].e=y;
}
for(int i=0;i<n;i++) {
cin>>x>>y;
b[i].s=x;
b[i].e=y;
}//在这之前都是输入
int i=0,j=0;
while(i<=n-1&&j<=n-1)//正片开始,循环的终止条件是a或b都装车完毕
{
if(!(a[i].e<=b[j].s||a[i].s>=b[j].e)) {//如果a和b的时间有重叠,那么就要将重叠的时间加入res
end=min(a[i].e,b[j].e);//无论a先结束还是b先结束,只要他们有重叠的部分,一定是最小的end-最大的start
st=max(a[i].s,b[j].s);
res+=end-st;
}
if(a[i].e>b[j].e) j++;//无须看a和b的开始,只要看结束,谁先结束,谁就要进入下一个时间段来赶上对方
else if(a[i].e<b[j].e) i++;
else {//如果他们两个结束的时间相等,那么就要同时进入下一个时间段
i++;
j++;
}
}
cout<<res;
return 0;
}