zoukankan      html  css  js  c++  java
  • 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%(不过这个方法多省事啊

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

     

     
  • 相关阅读:
    组原——④存储器4
    sdk和api的区别
    转载:直播测试
    生成短链接
    H5调原生
    Android Intent 启动方法和启动Action大全
    ps和top的区别
    安卓知识点
    正则基础之——捕获组(capture group)
    正则基础之——反向引用
  • 原文地址:https://www.cnblogs.com/qingdaodaozhu/p/15238150.html
Copyright © 2011-2022 走看看