csp试题2:买菜

csp试题2:买菜

题目

问题描述
      小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型变量占用一个字节学过计算机组成与设计的同学应该可以看懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值