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%(不过这个方法多省事啊
我回来,是为了那些回不来的人