小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;
}