csp練題記錄(C語言,編譯器dev c++)201809-2 買菜

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章