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, a< b< ai+1,c< d< 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%(不过这个方法多省事啊

 我回来,是为了那些回不来的人

 

 
原文地址:https://www.cnblogs.com/qingdaodaozhu/p/15238150.html