20180902买菜(Java、C++、Python版本)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zkzbhh/article/details/84303828

题目描述

小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.csdn.net/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.csdn.net/SL_logR/article/details/83445144 

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zkzbhh/article/details/84303828