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分讓我清醒。分析清題目涉及到的數據之間的相互關係很重要!!!(此處復讀機開啓=_=||)