CSP题目:小H小W买菜装车聊天时间

小H小W买菜装车聊天时间

CSP题目
问题描述:小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。
  给两个人设定两个数组t[i],t1[i] 当装车时置1,当t[i]=t1[i]时 总数sum++。

c++代码如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
#define ListInitSize 256							//初次分配空间大小 
#define ListIncrement 128							//空间分配增量大小 

typedef struct List
{
	int *pData;										//动态存储空间的基地址 
	int length;										//存储数据元素的个数
	int size;										//当前已分配的存储空间的大小 
}List;

void InitList( List &L )
{	//初始化顺序表 
	cout<<"-进行初始化操作-"<<endl;
	L.pData = (int *)malloc(ListInitSize * sizeof(int));			//申请存储空间
	if( L.pData == NULL )
		exit(1);									//存储空间申请失败
	L.size = ListInitSize;							//当前已分配的存储空间大小
	L.length = 0;									//存储数据元素个数为零
}	//InitList

void ListTraverse( List L )
{	//访问并输出每个元素
	cout<<"-输出顺序表如下-"<<endl;
	for( int i = 0; i < L.length; i++ )				//遍历整个顺序表 
	{
	 	cout<<L.pData[i]<<endl;						//访问并输出元素 
	}
}	//ListTraverse

void InsertElem( List &L, int i, int e )
{	//在顺序表第i个位置上插入数据元素e
	if( i < 0 || i > L.length+1 )					//参数检查
		cout<<"error2"<<endl;
	if( L.length >= L.size )						//当前存储空间已满,需增加存储空间
	{
		int *newbase = ( int* ) realloc( L.pData, (L.size+ListIncrement)*sizeof(int) );
		if( newbase == NULL )
			cout<<"error3"<<endl;					//内存申请失败
		L.pData = newbase;
		L.size += ListIncrement; 
	}
	//从最后一个元素开始,直到下标为i-1(物理位置)的元素,依次向后挪一个位置
	for( int j = L.length-1; j >= i-1; j-- )
		L.pData[j+1] = L.pData[j];
	L.pData[i-1] = e;								//在数组下标为i-1的位置上插入元素e
	L.length += 1;									//顺序表的长度加1
}	//InsertElem

int TalkTime( List &L, int a, int b )
{	//处理聊天时间数据 
	int i;
	for( i = a; i < b; i ++ )
	{
		L.pData[i] = 1;								//标记,表示该时间点正在装车 
	}
}	//TalkTime

int Max( int a, int b )
{	//比较最大值
	if( a >= b )
		return a;
	else
		return b; 
}	//Max

int main()
{
	List TimeH, TimeW;
	int n, i, j = 0, a, b, num = 0, m;
	int &x = a, &y = b; 
	InitList(TimeH);
	InitList(TimeW);
	cout<<"-请输入一个正整数n,表示时间段的数量-"<<endl;
	cin>>n;
	cout<<"-在接下来的"<<n<<"行,每行输入两个数描述小H的各个装车的时间段-"<<endl;
	for( i = 0; i < n ; i ++ )
	{
		cin>>a>>b;
		for( ; j <= b; j ++ )
		{
			InsertElem( TimeH, j, 0 );				//每个时间点都先标记为0 
		}
		TalkTime( TimeH, x, y );
	}
	cout<<"-在接下来的"<<n<<"行,每行输入两个数描述小W的各个装车的时间段-"<<endl;
	j = 0;
	for( i = n; i < n+n ; i ++ )
	{
		cin>>a>>b;
		for( ; j <= b; j ++ )
		{
			InsertElem( TimeW, j, 0 );				//每个时间点都先标记为0 
		}
		TalkTime( TimeW, x, y );
	}
	m = Max( TimeH.length, TimeW.length );
	for( i = 0; i < m; i ++ )
	{
		if( TimeH.pData[i] == 1 && TimeW.pData[i] == 1 )
			num ++;									//该时间点两人都在装车,即在聊天 
	}
	cout<<"-输出两人聊天时间-"<<endl;
	cout<<num<<endl;
 } 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值