题目描述
小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]…[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]…[cn,dn]在装车。其中,一个时间段[s, t]表示的是从时刻s到时刻t这段时间,时长为t-s。
由于他们是好朋友,他们都在广场上装车的时候会聊天,他们想知道他们可以聊多长时间。
输入格式
输入的第一行包含一个正整数n,表示时间段的数量。
接下来n行每行两个数ai,bi,描述小H的各个装车的时间段。
接下来n行每行两个数ci,di,描述小W的各个装车的时间段。
输出格式
输出一行,一个正整数,表示两人可以聊多长时间。
样例输入
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
样例输出
3
数据规模和约定
对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。
- Java版本
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.xml.stream.events.StartDocument;
public class Main {
static Scanner sc; //输入流
static int total; //总计时间段个数
static int time; //可以聊的时间长度
static List<Time> list1; //小H的时间段
static List<Time> list2; //小W的时间段
public static void main(String[] args) {
sc=new Scanner(System.in);
total=sc.nextInt();
list1=new ArrayList<>();
list2=new ArrayList<>();
for(int i=0;i<total;i++){
list1.add(new TimeGap(sc.nextInt(), sc.nextInt()));
}
for(int i=0;i<total;i++){
list2.add(new TimeGap(sc.nextInt(), sc.nextInt()));
}
for(int i=0;i<total;i++){
for(int j=0;j<total;j++){
if((list1.get(i).start>=list2.get(j).end)||(list2.get(j).start>=list1.get(i).end)){ continue;}
else if((list1.get(i).start>=list2.get(j).start)&&(list2.get(j).end<=list1.get(i).end)){
time+=list2.get(j).end-list1.get(i).start;
}
else if((list2.get(j).start>=list1.get(i).start)&&(list2.get(j).end>=list1.get(i).end)){
time+=list1.get(i).end-list2.get(j).start;
}
else if((list2.get(j).start>=list1.get(i).start)&&(list2.get(j).end<=list1.get(i).end)){
time+=list2.get(j).end-list2.get(j).start;
}
else if((list2.get(j).start<=list1.get(i).start)&&(list1.get(i).end<=list2.get(j).end)){
time+=list1.get(i).end-list1.get(i).start;
}
else{
continue;
}
}
}
System.out.println(time);
}
}
class Time{
public int start;
public int end;
public Time(int start,int end) {
this.start=start;
this.end=end;
}
}
- C++版本
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,ans=0;//ans存储最终结果
scanf("%d",&n);
vector<pair<int,int> >v1(n),v2(n);//分别存储小H和小W的装车时间段
for(int i=0;i<n;++i)
scanf("%d%d",&v1[i].first,&v1[i].second);
for(int i=0;i<n;++i)
scanf("%d%d",&v2[i].first,&v2[i].second);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
if(v1[i].first<=v2[j].second&&v1[i].second>=v2[j].first)//判断有无重叠区间
ans+=min(v1[i].second,v2[j].second)-max(v1[i].first,v2[j].first);//加上重叠区间
printf("%d",ans);
return 0;
}
---------------------
转自:https://blog.youkuaiyun.com/richenyunqi/article/details/83387803
- Python版本
#买菜
H=[]#小H时间
W=[]#小W时间
#输入
n = int(input());
for i in range(n):
H.append(tuple(map(int,input().split())))
for i in range(n):
W.append(tuple(map(int,input().split())))
#最大时间点
tlen = max(H[-1][-1],W[-1][-1])
#时间线,每个时间段计数为0
timeline = [0]*tlen
#取出时间段start,end中间的时间段计数加一
#小H计数
for s,e in H:
for i in range(s,e):
timeline[i] += 1
#小W计数
for s,e in W:
for i in range(s,e):
timeline[i] += 1
#输出计数为2的时间段个数
print(timeline.count(2))
---------------------
原文:https://blog.youkuaiyun.com/SL_logR/article/details/83445144
卖菜算法:https://blog.youkuaiyun.com/zkzbhh/article/details/84260713