题目
问题描述
小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,表示时间段的数量。
接下来n行每行两个数ai,bi,描述小H的各个装车的时间段。
接下来n行每行两个数ci,di,描述小W的各个装车的时间段。
输出格式
输出一行,一个正整数,表示两人可以聊多长时间。
样例
输入:
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
输出:
3
数据规模与约定
对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。
分析
使用了一种很简单的方法来解题。
首先初始化H和W两人买菜从头到尾的时间,如果某一时间内处于装菜过程,则此时为他们的聊天时间。
从他们两人最早的开始时间到最晚的结束时间,判断两人在同一时间内是否都处于装菜状态,如果是,则他们的聊天时间加1。
结束后,输出聊天时间。
使用以上方法解题,最需要注意的是内存是否会溢出:题目规定了1 ≤ ai, bi, ci, di ≤ 1000000,即时间从1到1000000,我们需要为两个人申请1000000块地址空间,因为这些空间内不需要保存整数,只是记录一个是否处于装菜状态的标记,所以空间类型申请为bool,c++中占1Bytes,然后2 x 1Bytes x 1000000 <2GB = 2 x 1024 x 1024 x 1Bytes,额。。。还是占用了2G的空间,但定义在全局区应该问题不大。
代码
/*
20190927
csp试题2:买菜
*/
#include <iostream>
using namespace std;
bool H_time[1000001];
bool W_time[1000001];
int h_len = 0;
int w_len = 0;
int main(){
//接收数据
int times;
cin >>times;
int begin = 0;
int end = 0;
for(int i=0; i<times; i++){
cin >>begin >>end;
for(int j=begin; j<end; j++){
H_time[j] = 1;
}
h_len = end;
}
for(int i=0; i<times; i++){
cin >>begin >>end;
for(int j=begin; j<end; j++){
W_time[j] = 1;
}
w_len = end;
}
//处理数据
int len = h_len;
if(len < w_len){
len = w_len;
}
int num = 0;
for(int i=0; i<len; i++){
if(H_time[i] == 1 && W_time[i] == 1){
num++;
}
}
//输出
cout <<num<<endl;
return 0;
}
总结
显然这次在解题时就像偷懒了一样,但同样暴露出了一些问题,我之前一直以为bool类型只占1bit,但在网上一查发现并没有那么简单,它占了1Byte。为什么要占1Byte呢?下面这篇文章我感觉写的很好:为什么C语言中bool型变量占用一个字节学过计算机组成与设计的同学应该可以看懂。