【題目描述】
為了准備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。一共有n張地毯,編號從1到n。現在將這些地毯按照編號從小到大的順序平行於坐標軸先后鋪設,后鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成后,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。
輸入輸出樣例1說明:如下圖,1號地毯用實線表示,2號地毯用虛線表示,3號用雙實線表示,覆蓋點(2,2)的最上面一張地毯是3號地毯。
輸入輸出樣例2說明:如下圖,1號地毯用實線表示,2號地毯用虛線表示,3號用雙實線表示,覆蓋點(4,5)的最上面沒有一張地毯。
【輸入】
第一行,一個整數n,表示總共有n張地毯。
接下來的n行中,第i+1行表示編號i的地毯的信息,包含四個正整數a,b,g,k,每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的坐標(a,b)以及地毯在x軸和y軸方向的長度。
第n+2行包含兩個正整數x和y,表示所求的地面的點的坐標(x,y)。
【輸出】
輸出共1行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-1。
【輸入樣例】
3 1 0 2 3 0 2 3 3 2 1 3 3 2 2
【輸出樣例】
3
【提示】
樣例輸入#2:
3 1 0 2 3 0 2 3 3 2 1 3 3 4 5
樣例輸出#2:
-1
【數據范圍】
全部數據,1≤n≤10000
1.這應該是我在博客里寫的第一個數組的題哈。
按規矩還是講一下一開始看到題的感受。
話說這好像是NOIP的原題,以前見過但沒做,
作為一本通一維數組的最后一道題,
剛看還是覺得不怎么好做的。
但確實一點技術含量都沒有...
2.又到了分析題干的時間了。
首先看到這個題,直接給了個直角坐標系,
順便還給了我們所要設的所有參數,
首先我們可以找到輸入后不變的量,也就是那個定點的坐標,
我們把變量(就是地毯,因為有好幾塊)和這個坐標循環比較。
比較好得關系:
如果這個點在這塊地毯上,
則它的橫坐標必在地毯橫向兩端點橫坐標的范圍內,
縱坐標比在地毯縱向兩端點的范圍之內。
3.好了其他也沒什么可講的了,
直接對着正解走一遍吧
#include<iostream> using namespace std; int main() { int n,x,y;//定義地毯張數和定點坐標 int a[10001],b[10001],g[10001],k[10001];//定義地毯 int i; cin>>n; for(i=1;i<=n;i++)//循環輸入n張地毯的信息 { cin>>a[i]>>b[i]; cin>>g[i]>>k[i]; } cin>>x>>y;//輸入定點坐標 for(i=n;i>=1;i--)//循環都好理解,i--的目的是從上往下對照地毯,實現輸出最上面的地毯。 { if((x>=a[i]&&x<=a[i]+g[i]) && (y>=b[i]&&y<=b[i]+k[i]))//邊界條件 { cout<<i<<endl;//輸出地毯編號 return 0; } } cout<<-1<<endl;//該定點沒有被任何地毯覆蓋 return 0; }
嗯對就是這樣。
4.喜聞樂見的總結時間又到了:
話說這個題真的非常水,
其實我寫着博客的時候,
就覺得這個題其實沒什么特殊的,
數組的題,
特別是一維數組的題,我覺得都還好。
關鍵是細心,
對於邊界條件的把控,
以及題干中一些比較特殊的要求也要注意,
比如這個題中要求輸出最上面地毯的編號。
細心,千萬細心!