20180902買菜(Java、C++、Python版本)
阿新 • • 發佈:2018-11-23
題目描述
小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