试题编号: | 201809-2 |
试题名称: | 买菜 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小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,表示时间段的数量。 输出格式 输出一行,一个正整数,表示两人可以聊多长时间。 样例输入 4 样例输出 3 数据规模和约定 对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。 |
这题测试样例一开始让我有点懵,我推不出3,程序跑出来是8,结果发现它的[a1,b1]这种区间是左闭右开的不是左闭右闭的,
那为啥它要这样写服了笑哭脸,代码没东西,遍历一下遍历到一个让数组值+1,如果是两个人时间交集的时刻的话,那个时刻数组的
值就为2所以最后输出数组中值为2的元素的个数即可.坑点在区间的左闭右开,不过发现不对试一下应该也能想到.
ac代码:
import java.util.Scanner;
public class Main {
Scanner scanner = new Scanner(System.in);
public void buyFood(){
int n = scanner.nextInt();
int[] H = new int[1000001];
int start = 0;
int end = 0;
int min = Integer.MAX_VALUE;
int max = 0;
for(int i=0;i<2*n;i++){
start = scanner.nextInt();
end = scanner.nextInt();
min = Math.min(min,start);
max = Math.max(max,end);
for(int j = start;j<end;j++)
H[j]++;
}
int count = 0;
for(int i=min;i<=max;i++){
if(H[i]==2)
count++;
}
System.out.println(count);
}
public static void main(String[] args) {
Main main = new Main();
main.buyFood();
}
}