1. 程式人生 > >第四場B

第四場B

思路 truct n) ron tle msu 行人檢測 科技 vertica

商湯科技近日推出的 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