1. 程式人生 > >20180902買菜(Java、C++、Python版本)

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

題目描述

小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 

在這裡插入圖片描述