1. 程式人生 > 其它 >CSP201809-2 買菜(超簡單的方法!!)

CSP201809-2 買菜(超簡單的方法!!)

問題描述   小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。
思路: 以題目的樣例為例:首先找到最大時刻,為15,那麼表示共有14個長度為1的時間段(1-2,2-3,.....,14-15),然後根據小H和小W各自的資料確定他們在哪些個區間,標記這些區間,既被小H標記過又被小W標記過 的區間數量之和即為他們聊天的時間。如下圖:藍點表示小H,粉表示小W,共有的時間段有三個。
 1
#include<stdio.h> 2 #include<iostream> 3 const int N = 1000000; 4 using namespace std; 5 6 struct node 7 { 8 int tem;//時間段標記,沒實際用處 9 int tsuna = 0; 10 int apoer = 0; 11 }Time[N]; 12 int main(void) 13 { 14 int n; 15 cin >> n; 16 int tsuna[n][2]; 17 int apoer[n][2
]; 18 for (int i = 0; i < n; i++) 19 { 20 cin >> tsuna[i][0] >> tsuna[i][1]; 21 } 22 for (int i = 0; i < n; i++) 23 { 24 cin >> apoer[i][0] >> apoer[i][1]; 25 } 26 int max; 27 if (tsuna[n - 1][1] > apoer[n - 1][1]) 28 { 29 max = tsuna[n - 1][1]; 30 } 31 else 32 { 33 max = apoer[n - 1][1]; 34 } 35 max = max - 1;//時間段 36 37 for (int i = 0; i < max; i++) 38 { 39 Time[i].tem = i;//表示(i,i+1)這一段 40 } 41 for (int i = 0; i < n; i++) 42 { 43 for (int j = tsuna[i][0]; j < tsuna[i][1]; j++) 44 { 45 Time[j].tsuna = 1;//(tsuan[i][0],tsuna[i][0]+1)時間段標記 46 } 47 } 48 for (int i = 0; i < n; i++) 49 { 50 for (int j = apoer[i][0]; j < apoer[i][1]; j++) 51 { 52 Time[j].apoer = 1;//(apoer[i][0],apoer[i][0]+1)時間段標記 53 } 54 } 55 56 int count = 0; 57 for (int i = 0; i < max; i++) 58 { 59 if (Time[i].tsuna == 1 && Time[i].apoer == 1) 60 { 61 count++; 62 } 63 } 64 cout << count << endl; 65 66 return 0; 67 }

注意:通過90%(不過這個方法多省事啊

我回來,是為了那些回不來的人