第四場B
商湯科技近日推出的 SenseVideo 能夠對視頻監控中的對象進行識別與分析,包括行人檢測等。在行人檢測問題中,最重要的就是對行人移動的檢測。由於往往是在視頻監控數據中檢測行人,我們將圖像上的行人抽象為二維平面上若幹個的點。那麽,行人的移動就相當於二維平面上的變換。
在這道題中,我們將行人的移動過程抽象為 平移,有兩個 移動參數:dx,dy.每次行人的移動過程會將行人對應的所有點全部平移,對於平移前的點 (x,y),平移後的坐標為 (x+dx,y+dy).?? 和 dyd_yd?y??。每次行人的移動過程會將行人對應的所有點全部平移,對於平移前的點 (x,y)(x, y)(x,y),平移後的坐標為 (x+dx,y+dy)(x + d_x, y + d_y)(x+d?x??,y+d?y??)。
我們現在已知一個行人對應著 n 個點,坐標分別為 (x1,y1),(x2,y2)…(xn,yn),平移後為(x1‘,y1‘)(x2‘,y2‘)(xn‘,yn‘).1??,y?1??),(x?2??,y?2??)…(x?n??,y?n??),平移後的坐標分別為 (x1′,y1′),(x2′,y2′)…(xn′,yn′)(x_1‘,y_1‘),(x_2‘,y_2‘)\ldots (x_n‘,y_n‘)(x?1?′??,y?1?′??),(x?2?′??,y?2?′??)…(x?n?′??,y?n?′??)。
很顯然,通過平移前後的正確坐標,很容易算出行人的移動參數,但問題沒有這麽簡單。由於行人實際的移動並不會完全按照我們預想的方式進行,因此,會有一部分平移後的坐標結果不正確,但可以確保 結果不正確的坐標數量嚴格不超過一半
你現在作為商湯科技的實習生,接手了這個有趣的挑戰:算出行人的移動參數。如果不存在一組合法的移動參數,則隨意輸出一組參數;如果有多種合法的移動參數,輸出其中任意一組合法的即可。
輸入格式
第一行輸入一個整數 n(1≤n≤105)5??),表示行人抽象出的點數。
接下來 n 行,每行 4個 整數。前兩個數表示平移前的坐標,後兩個數表示平移後的坐標。
坐標範圍在 -10^9?10^9?^9?? 到 10910^910?9?? 之間。
輸出格式
一行兩個整數,dx,dy表示人的移動參數。x?? 和 dyd_yd?y??,表示行人的移動參數。
樣例輸入
5 0 0 1 1 0 1 1 2 1 0 2 1 1 1 0 0 2 1 1 0
樣例輸出
1 1
思路:我們可以得到n組,x的移動參數,y的n的參數,用map存下,判斷下就OK了
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 struct node{ 6 int x,y; 7 }a[100005]; 8 map<pair<int,int > ,int >b; 9 int main(){ 10 int n; 11 scanf("%d",&n); 12 int x1,x2,y1,y2; 13 for(int i=1;i<=n;i++){ 14 scanf("%d%d",&x1,&y1); 15 scanf("%d%d",&x2,&y2); 16 a[i].x=x2-x1; 17 a[i].y=y2-y1; 18 } 19 int m=n/2; 20 if(n%2==1) m++; 21 int xx=2,yy=2; 22 for(int i=1;i<=n;i++){ 23 b[make_pair(a[i].x,a[i].y)]++; 24 if( b[make_pair(a[i].x,a[i].y)]>=m){ 25 xx=a[i].x; 26 yy=a[i].y; 27 } 28 } 29 cout<<xx<<" "<<yy<<endl; 30 return 0; 31 }
第四場B