题目描述

解题

解题思路:

  1. 小蘑的时间假设为[a,b],小菇的时间假设是[c+t,d+t],小菇起床的时间是t∈[l,r]
  2. 那么当"a < b < (c+t) < (d+t)"或者"(c+t) < (d+t) < a < b"的情况时,小蘑和小菇无法聊天,由题目条件已知"a < b""c < d",那么推出"(c+t) < (d+t)"
  3. 所以仅仅当"b < (c+t)"或者"(d+t) < a"时无法聊天,其余情况都是可以聊天的

开始理解题目是:在空闲时间都要聊天,看了上面讲解,在空闲时间段至少有一次聊天就好了

import java.util.Scanner;
public class Main{
    int p,q,l,r;
    int[][] A,B;
    int count;
    public static void main(String[] args){
        Main m = new Main();
        m.run();
    }
    public void run(){
         Scanner in = new Scanner(System.in);
         while(in.hasNext()){
             count = 0;
             String[] pqlr = in.nextLine().split(" ");
             p = Integer.valueOf(pqlr[0]);
             q = Integer.valueOf(pqlr[1]);
             l = Integer.valueOf(pqlr[2]);
             r = Integer.valueOf(pqlr[3]);
             if(!Judgepq(p,q) && !Judgelr(l,r))
                 continue;
             A = new int[p][2];
             B = new int[q][2];
             for(int i =0;i<p;i++){
                 String[] row = in.nextLine().split(" ");
                 A[i][0] = Integer.valueOf(row[0]);
                 A[i][1] = Integer.valueOf(row[1]);
             }
             for(int i =0;i<q;i++){
                 String[] row = in.nextLine().split(" ");
                 B[i][0] = Integer.valueOf(row[0]);
                 B[i][1] = Integer.valueOf(row[1]);
             }
             for(int t = l;t<=r;t++){
                 if(isWake(t)){
                     count++;
                 }
             }
             System.out.println(count);
         }
        
    }
    public boolean isWake(int t){
        for(int i=0;i<A.length;i++){
            for(int j =0;j<B.length;j++){
                if(! (A[i][1] < B[j][0] + t) || ! (B[j][1] + t< A[i][0])){
                        return true;// 在这个时间点起床 可以聊天就好,不在乎聊几次
                }
            }
        }
        return false;
    }
    public boolean Judgepq(int p,int q){
        if(p>=1 && p<=50  && q>=1 && p<=50)
            return true;
        return false;
    }
    public boolean Judgelr(int l,int r){
        if(l>=0&& r>=0 && l<=1000 && r<=1000)
            return true;
        return false;
    }
}

参考链接