您的位置:首页 > 其它

2017计蒜之道初赛第四场-商汤科技的行人检测(简单)

2017-05-28 21:22 218 查看

商汤科技的行人检测(简单)

商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。
在这道题中,我们将行人的移动过程抽象为 平移,有两个 移动参数:d_xd​x​​ 和 d_yd​y​​。每次行人的移动过程会将行人对应的所有点全部平移,对于平移前的点 (x,
y)(x,y),平移后的坐标为 (x
+ d_x, y + d_y)(x+d​x​​,y+d​y​​)。

我们现在已知一个行人对应着 nn 个点,坐标分别为 (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​​),平移后的坐标分别为 (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
\le n \le 10^5)n(1≤n≤10​5​​),表示行人抽象出的点数。

接下来 nn 行,每行 44 个 整数。前两个数表示平移前的坐标,后两个数表示平移后的坐标。

坐标范围在 -10^9−10​9​​ 到 10^910​9​​ 之间。

输出格式

一行两个整数,d_xd​x​​ 和 d_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


题目大意:中文题

解题思路:x,y坐标偏移,丢到unordered_map里,然后按值排序,取最大的,如果大于等于一半就可以。

#include<iostream>
#include<cstring>
#include<cmath>
#include<ctime>
#include<unordered_map>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<fstream>
#include<set>
#include<vector>
#include<map>
using namespace std;
const int MAXN=1e5+10;
const int INF=0x3f3f3f3f;
typedef long long LL;
unordered_map<LL,LL> mx;
unordered_map<LL,LL> my;

struct node
{
LL d,c;
node(LL _d,LL _c):d(_d),c(_c){}
};
vector<node> vx,vy;

bool cmp(node a,node b)
{
return a.c>b.c;
}

int main()
{
int n;
int x1,y1,x2,y2;
while(cin>>n)
{
mx.clear();
my.clear();
vx.clear();
vy.clear();
for(int i=1;i<=n;i++)
{
cin>>x1>>y1>>x2>>y2;
mx[x2-x1]++;
my[y2-y1]++;
}
unordered_map<LL,LL>::iterator it;
for(it=mx.begin();it!=mx.end();it++)
vx.push_back(node(it->first,it->second));
sort(vx.begin(),vx.end(),cmp);
vector<node>::iterator itv;
itv=vx.begin();
LL ansx=0,ansy=0;
if((*itv).c>=n/2)
{
ansx=(*itv).d;
for(it=my.begin();it!=my.end();it++)
vy.push_back(node(it->first,it->second));
sort(vy.begin(),vy.end(),cmp);
itv=vy.begin();
if((*itv).c>=n/2)
{
ansy=(*itv).d;
cout<<ansx<<" "<<ansy<<endl;
}else
{
cout<<ansx<<" "<<ansy<<endl;
}
}else
{
cout<<ansx<<" "<<ansy<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: