CCF计算机软件能力认证试题练习:201809-2 买菜

买菜

来源:CCF

标签:

参考资料:

相似题目:

题目

小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。(表示不唯一)
第一种情况:
在这里插入图片描述
第二种情况:
在这里插入图片描述
第三种情况:
在这里插入图片描述
第四种情况:
在这里插入图片描述
第五种情况:
在这里插入图片描述
第六种情况:
在这里插入图片描述

参考代码

#include
#define MAXN 2005

struct DURATION{
	int s,t; //s是左端,t是右端
}dura1[MAXN],dura2[MAXN]; //dura1:小H,dura2:小W

int n;

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&dura1[i].s,&dura1[i].t);
	}
	for(int i=0;i<n;i++){
		scanf("%d%d",&dura2[i].s,&dura2[i].t);
	}
	int i=0,j=0;
	int ans=0;
	//同时遍历小H和小W的时间段
	while(i<n && j<n){
		if(dura1[i].t<=dura2[j].s){
			i++;
			continue;
		}
		
		if(dura1[i].s<dura2[j].s && dura1[i].t<dura2[j].t){
			ans+=dura1[i].t-dura2[j].s;
			i++;
			continue;
		}
		
		if(dura1[i].s>=dura2[j].s && dura1[i].t<dura2[j].t){
			ans+=dura1[i].t-dura1[i].s;
			i++;
			continue;
		}
		
		if(dura1[i].s>=dura2[j].s && dura1[i].s<=dura2[j].t && dura1[i].t>=dura2[j].t){
			ans+=dura2[j].t-dura1[i].s;
			j++;
			continue;
		}
		
		if(dura1[i].s>dura2[j].t){
			j++;
			continue;
		}
		
		if(dura1[i].s<=dura2[j].t && dura1[i].t>=dura2[j].t){
			ans+=dura2[j].t-dura2[j].s;
			j++;
			continue;
		}
	}
	printf("%d",ans);
	return 0;
} 

你可能感兴趣的:(【记录】算法题解)