题目描述
解题
解题思路:
- 小蘑的时间假设为
[a,b]
,小菇的时间假设是[c+t,d+t]
,小菇起床的时间是t∈[l,r]
- 那么当
"a < b < (c+t) < (d+t)"
或者"(c+t) < (d+t) < a < b"
的情况时,小蘑和小菇无法聊天,由题目条件已知"a < b"
和"c < d"
,那么推出"(c+t) < (d+t)"
- 所以仅仅当
"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; } }