csp练题记录(C语言,编译器dev c++)201809-2 买菜
一、题目描述
二、思路分析
输入数据分析:看数据规模和约定,所以设了两个二维数组h[2][2000],w[2][2000]来存储二人买菜的时间,考虑到数字多,数值大,总时间不妨设成long long int型的。
采用两个for循环来遍历两个数组:外层循环用来遍历h的买菜时间(循环变量i),内层循环用来遍历w的买菜时间(循环变量j)。这样,每次判断h[i]和w[j]的关系:(在数轴上就很明了),如上图:当w的最大比h的最小小和w的最小比h的最大时(上图中对角线),说明二者买菜时间没有交集,不进行下一步操作,直接一个continue继续循环。当二者有交集时,用取并集的思想:开始碰头时间为h,w中最大的一个,结束会面时间为h,w中最小的一个。二者相减就是此次可以闲聊的时间,总时间的话就一直累加,最后输出。
三、代码
#include<stdio.h>
int main()
{
int n,h[2][2000],w[2][2000];
long long int time=0;
scanf("%d",&n);
int i,j,start,end;
for(i=0;i<n;i++)
scanf("%d %d",&h[0][i],&h[1][i]);
for(i=0;i<n;i++)
scanf("%d %d",&w[0][i],&w[1][i]);
for(i=0;i<n;i++)//遍历h
{
for(j=0;j<n;j++)//遍历w
{
if(w[0][j]>h[1][i]||w[1][j]<h[0][i])continue;
start=h[0][i]>w[0][j]?h[0][i]:w[0][j];
end=h[1][i]>w[1][j]?w[1][j]:h[1][i];
time=time+end-start;
}
}
printf("%lld",time);
return 0;
}
四、反思总结
关键在于分析题目,不能把答案凑出来能跑通它的例子就觉得万事大吉了,例子只是最基本要求,涉及到的数据也只是其中的一小类(不一定能反应题目所求的所有类型)。开始的时候我就很粗心,差不多得了,跑通了例子就行,0分让我清醒。分析清题目涉及到的数据之间的相互关系很重要!!!(此处复读机开启=_=||)