基本算法思维——小明与小红聊天问题
问题:
小明和小红是身处异地的好朋友,两人经常在空闲时间进行网上聊天。两个人空闲时间都是安排好的,小明的时间表是固定的,是[a1, b1], [a2, b2], …, [ap, bp];而小红的时间表比较怪,是依赖她起床时间t的,是[c1+t, d1+t], [c2+t, d2+t], …, [cq+t, dq+t];值得注意的是,两个人时间表上的边界点也是空闲时间。小红起床时间t为[l, r]之间的任意一个整点时刻(也包括边界),只要两人能在任一时刻同时在线进行聊天,那么t就是小红合适的起床时间。询问小红能够有多少个合适的起床时间?
分析:穷举
(1)取(l, r)之间的任意整点时刻,且包含边界。
(2)该时刻满足任意一个区间,该时刻属于合适时间。
(3)取时刻 t后, 设小明区间(x1,y1),小红区间(x2,y2),
1、x2 <=y2 < x1:不满足
2、y2 >= x2 > y1:不满足
code:
1 import java.util.Scanner; 2 3 public class Main{ 4 5 public static void main(String[] args) { 6 Scanner s = new Scanner(System.in); 7 int p,q,l,r; 8 p = s.nextInt(); 9 double[][] ar1 = new double[p][2]; 10 q = s.nextInt(); 11 double[][] ar2 = new double[q][2]; 12 l = s.nextInt(); 13 r = s.nextInt(); 14 for(int i=0;i<p;i++) { 15 ar1[i][0] = s.nextDouble(); 16 ar1[i][1] = s.nextDouble(); 17 } 18 for(int i=0;i<q;i++) { 19 ar2[i][0] = s.nextDouble(); 20 ar2[i][1] = s.nextDouble(); 21 } 22 int count = 0; 23 double tempC = Double.MIN_VALUE; 24 double tempD = Double.MIN_VALUE; 25 boolean flag; 26 for(int i=l;i<=r;i++) { 27 for(int j=0;j<q;j++) { //控制ar2 28 flag = false; //控制跳出第二层循环 29 tempC = ar2[j][0]+i; //x2 30 tempD = ar2[j][1]+i; //y2 31 for(int k=0;k<p;k++) { // 控制ar1 32 if(tempC>ar1[k][1] || tempD<ar1[k][0]) { 33 continue; //不满足,直接下一次 34 }else { 35 count++; //满足,记录 36 flag = true; 37 break; //跳出最内层循环 38 } 39 } 40 if(flag) { 41 break; //跳出第二层循环 42 } 43 } 44 } 45 System.out.println(count); 46 } 47 48 }