买菜


from CCF-CSP 2018-09-2
Time limit:1s
Memory limit:256MB

买菜_#include


搞两个指针指向两个人的时间数组,指针不断移动来判断两个人的某两个时间段是否有交集,有交集则累加。

ac代码:
#include<iostream>
#include<algorithm>
using namespace std;
pair<int,int> pii1[2005]; //第一个人的信息
pair<int,int> pii2[2005]; //第二个人的信息
int n,note1 = 1,note2 = 1,sum; //n如题,note1是第一个人的指向,note2是第二个人的指向
int main(){
cin>>n;
for(int i = 1;i <= n;++i)
cin>>pii1[i].first>>pii1[i].second;
for(int i = 1;i <= n;++i)
cin>>pii2[i].first>>pii2[i].second;
while(note1 <= n && note2 <= n){
if(pii1[note1].second <= pii2[note2].first) //没有交集,移动第一个人
++note1;
else if(pii2[note2].second <= pii1[note1].first)//没有交集,移动第二个人
++note2;
else{
sum += (min(pii1[note1].second,pii2[note2].second) - max(pii1[note1].first,pii2[note2].first));
//有交集,算出时间并累加
if(pii1[note1].second < pii2[note2].second) //该指向时间区间在左边的人先移动
++note1;
else if(pii1[note1].second > pii2[note2].second)//该指向时间区间在左边的人先移动
++note2;
else
++note1,++note2;
}
}
cout<<sum;
return 0;
}