import java.util.Scanner;
/**
* <p>
* ClassName:Solution
* </p>
* <p/>
* Description:求小菇合适的起床时间
*<pre>
* Scanner cin = new Scanner(System.in);
* while (cin.hasNextInt()) {}//正确
* </pre>
* 写
* <pre>
* while(true){}//报错
* </pre>
* </P>
*
* @author sunnylinner
*/
public class Solution {
private static void isLegal(int num, int flag) {
//flag为0,判断[1,50],flag为1,判断[0,1000]
if (flag==0) {
if (!(1 <= num && num <= 50)) {
//数据非法
System.exit(0);
}
} else {
if (!(0 <= num && num <= 1000)) {
//数据非法
System.exit(0);
}
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while (cin.hasNextInt()) {
int p = 0, q = 0, l = 0, r = 0;
p = cin.nextInt();
isLegal(p, 0);
q = cin.nextInt();
isLegal(q, 0);
l = cin.nextInt();
isLegal(l, 1);
r = cin.nextInt();
isLegal(r, 1);
//检测输入数据是否有误
int[] time_A_B = new int[p * 2];//标识小蘑的时间
int[] time_C_D = new int[q * 2];//标识小菇的时间
for (int i = 0; i < time_A_B.length ; i++) {
//接收p行的数据,每一行都是一个时间对
int temp = cin.nextInt();
isLegal(temp, 1);
time_A_B[i] = temp;
}
for (int i = 0; i < time_C_D.length ; i++) {
//接收q行的数据,每一行都是一个时间对
int temp = cin.nextInt();
isLegal(temp, 1);
time_C_D[i] = temp;
}
int count = 0;//count表示小菇能有多少个合适的起床时间
begin:
for (int t = l; t <= r; t++) {
for (int i = 0; i < time_A_B.length; i += 2) {
for (int j = 0; j < time_C_D.length; j += 2) {
if (!(time_C_D[j] + t > time_A_B[i + 1] || time_C_D[j + 1] + t < time_A_B[i])) {
count++;
continue begin;
}
}
}
}
System.out.println(count);
}
}
}
/**
* 解题思路:
* 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"时无法聊天,其余情况都是可以聊天的
*/
解题思路:
- 小蘑的时间假设为
[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"
时无法聊天,其余情况都是可以聊天的