zoukankan      html  css  js  c++  java
  • CCF--201809-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。

    做这道题的时候,虽然觉得很简单,但是怎么都分不清区间,思考良久,终于豁然开朗

    我们可以先做一个大的划分,根据A.start和B.start的大小关系作出最初的划分,再在其中细化。

    
    #include<iostream>
    using namespace std;
    
    struct time{
        int start;
        int endt;
    
    }time;
    
    
    int main(){
        int n;
        cin >> n;
        struct time arr1[n];
        struct time arr2[n];
        for(int i = 0; i < n; i++){
            cin >> arr1[i].start >> arr1[i].endt;
        }
        for(int i = 0; i < n; i++){
            cin >> arr2[i].start >> arr2[i].endt;
        }
        int sum = 0;
        int i = 0,j = 0;
        while(i < n && j < n){
            //A的start在B之前
            if(arr1[i].start < arr2[j].start){
                if(arr2[j].endt < arr1[i].endt){
                    sum += arr2[j].endt - arr2[j].start;
                    j++;
                }else if(arr1[i].endt <= arr2[j].start){
                    i++;
                }else if(arr1[i].endt > arr2[j].start){
                    sum += arr1[i].endt - arr2[j].start;
                    i++;
                }
    
            }else{
                if(arr1[i].endt < arr2[j].endt){
                    sum += arr1[i].endt - arr1[i].start;
                    i++;
                }else if( arr1[i].start <= arr2[j].endt){
                    sum += arr2[j].endt - arr1[i].start;
                    j++;
                }else if(arr1[i].start > arr2[j].endt){
                    j++;
                }
    
            }
    
    
        }
    
    
            cout << sum << endl;
    
    
    }
    
    
  • 相关阅读:
    (Java实现) 洛谷 P1106 删数问题
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
    (Java实现) 洛谷 P1553 数字反转(升级版)
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1051 谁拿了最多奖学金
    (Java实现) 洛谷 P1106 删数问题
    目测ZIP的压缩率
  • 原文地址:https://www.cnblogs.com/yuyuan-bb/p/13647569.html
Copyright © 2011-2022 走看看