小白编程 | CCF CSP201809-2 买菜(思路分析)

纠错:QQ1002726595

解题思路

该题目为求交集,既不能错过长区间,又不能误判,于是需逐一对比,考虑几个情况

序号 情况 小H 小W 操作
1 EndTime(H) < StartTime(W) [1,2] [3,4] 跳过该组
2 EndTime(W) < StartTime(W) [5,10] [3,4] 用小W的下一组和小H的这一组继续进行对比,怎么比代码注释里有写
3 普通区间 [1,5] [3,4] 时长 = 结束时间早 - 开始时间晚

AC代码

#include

using namespace std;

/*/
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14

//*/

//区间结构体
struct Time{
	int from,to;
};

Time T1[2005];
Time T2[2005];

int main(){
	int n;
	scanf("%d",&n);
	int res = 0;
	//步骤1:输入小H的区间 
	for(int i = 0; i < n; i ++){
		scanf("%d %d",&T1[i].from,&T1[i].to);	 
	}
	//步骤2:输入小W的区间 
	for(int i = 0; i < n; i ++){
		scanf("%d %d",&T2[i].from,&T2[i].to);
	}
	for(int i = 0; i < n; i ++){
		//步骤3:逐一对比 
		for(int j = 0 ; j < n ; j ++){
			//步骤4:如果小W的开始区间比小H的开始区间大,证明没有交集直接break到下一组 
			if(T2[j].from >= T1[i].to){
				break;
			}
			/*/
			步骤5:
			如果小W的结束区间比小H的开始区间小,用下一组小W和这一组小H继续比
			这样可以防止小W错过小H的长区间 
			例如:
			小H     小W
			5  10 | 3  4
			11 20 | 6  7
			21 30 | 8  9 
			//*/
			if(T2[j].to <= T1[i].from){
				continue;
			}
			//步骤6:聊天时间=结束时间最小-开始时间最大 
			//[11,20]  [12,15]  =  15 - 12 = 3
			res += min(T1[i].to,T2[j].to) - max(T1[i].from,T2[j].from);
		} 
	}
	printf("%d",res);
	return 0;
}

要点

其实我一开始只拿了10分,我只套了1个循环,就是用输入的小W直接和上一个小H比,但是我发现不太对,长区间可能不止一次对比,所以我参考了博客https://blog.csdn.net/qq_42375636/article/details/88910857

总结就是要考虑到多种情况吧,多练练或许能发散思维。我感觉我还是没有那种思维吧。嘛,每天进步一点点。

上面的情况可能没有列完整,欢迎补充。

你可能感兴趣的:(CSP)