ccf 201809-2
Posted shiliuxinya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ccf 201809-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的各个装车的时间段。
输出格式
输出一行,一个正整数,表示两人可以聊多长时间。
题解:
①时间段不等同于时刻:时间段[s,t],时长为t-s,所代表的时刻为s,s+1,......t-1,不包含t时刻
比如时间段[1,3],时长为3-1=2,所包含时刻为1,2
②建立一个数组time,初始化为0。两个的n个时间段,遇到时间段[s,t],则s到t-1的time++,表示s到t-1时刻有空。
③time[i]=1表示第i时刻其中一人有空,time[i]=2表示该时刻被计算了两次,即两人都有空。最后计算重合部分,即time[i]==2的部分即可
#include <stdio.h> #include <string.h> #define MAX 1000005 using namespace std; int time[MAX]; int main(){ //时间段[s,t]:代表的是时刻s,...,t-1; 时长t-s int n,l,r; //时间段[1,3]:时长2,时刻1,2 long long result; while(scanf("%d",&n)!=EOF){ result=0; memset(time,0,sizeof(time)); for(int i=1;i<=n;i++){ scanf("%d %d",&l,&r); for(int j=l;j<r;j++) time[j]++; } for(int i=1;i<=n;i++){ scanf("%d %d",&l,&r); for(int j=l;j<r;j++) time[j]++; } for(int i=1;i<=MAX;i++){ //计算重合的时刻 ,注意:这里遍历的是时刻,不是时间段,所以是MAX,不是n if(time[i]==2) result++; } printf("%lld ",result); } return 0; }
以上是关于ccf 201809-2的主要内容,如果未能解决你的问题,请参考以下文章