zoukankan      html  css  js  c++  java
  • CCF——买菜(2018-09)

    问题描述

      小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。

    说明:开始的想法是傻傻的判断两个时间段有没有重合的部分,每一个时间段都和另一个时间段比较(当然不是全比较,有改进),那么这个判断的条件有很多,想明白条件了,emmmm,提交~~~,没有全部通过,很郁闷!后面便有了方法二,简单明了,顺利通过。

    方法一:

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] arr1 = new int[2000];
            int[] arr2 = new int[2000];
    
            for (int i = 0; i < 2 * n; i++) {
                arr1[i] = sc.nextInt();
            }
            for (int i = 0; i < 2 * n; i++) {
                arr2[i] = sc.nextInt();
            }
            int time = 0;
            for (int i = 0; i < 2 * n; i += 2) {
                for (int j = 0; j < 2 * n; j += 2) {
                    if (arr1[i] >= arr2[j + 1] || arr2[j] > arr1[i + 1]) {
                        continue;
                    } else {
                        if (arr1[i] <= arr2[j] && arr1[i + 1] <= arr2[j + 1]) {
                            time = time + (arr1[i + 1] - arr2[j]);
                        } else if (arr2[j] <= arr1[i] && arr2[j + 1] <= arr1[i + 1]) {
                            time = time + (arr2[j + 1] - arr1[i]);
                        } else if (arr1[i] <= arr2[j] && arr1[i + 1] >= arr2[j + 1]) {
                            time = time + (arr2[j + 1] - arr2[j]);
                        } else if (arr2[j] <= arr1[i] && arr2[j + 1] >= arr1[i + 1]) {
                            time = time + (arr1[i + 1] - arr1[i]);
                        } else {
                            continue;
                        }
                    }
                }
            }
            System.out.print(time);
            sc.close();
        }
    }

    方法二:

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            int[] t = new int[1000000];
            int count = 0;
    
            for (int i = 0; i < n * 2; i++) {
                int a = input.nextInt();
                int b = input.nextInt();
                for (int j = a; j < b; j++)
                    t[j]++;
            }
    
            for (int i : t)
                if (i > 1)
                    count++;
    
            System.out.println(count);
        }
    
    }
  • 相关阅读:
    [ jquery 选择器 :hidden ] 此方法选取匹配所有不可见元素,或者type为hidden的元素
    剑指 Offer 03. 数组中重复的数字 哈希
    LeetCode 1736. 替换隐藏数字得到的最晚时间 贪心
    Leetcode 1552. 两球之间的磁力 二分
    Leetcode 88. 合并两个有序数组 双指针
    LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?
    LeetCode 1743. 相邻元素对还原数组 哈希
    LeetCode 1745. 回文串分割 IV dp
    剑指 Offer 47. 礼物的最大价值 dp
    剑指 Offer 33. 二叉搜索树的后序遍历序列 树的遍历
  • 原文地址:https://www.cnblogs.com/tangxlblog/p/9977796.html
Copyright © 2011-2022 走看看