A. 商汤科技的安全令牌
商汤科技致力于引领人工智能核心“深度学习”技术突破,构建人工智能、大数据分析行业解决方案。作为一家人工智能公司,用机器自动地解决各类实际问题自然不在话下。近日,商汤科技推出了一套安全令牌,令牌如下图所示:
安全令牌上的小孔有 n 行 m 列,不过有些行和有些列已经用导线整体焊接了,共有 k 根导线。
我们可以在安全令牌上 不重叠 地焊接若干个小芯片,每个芯片需要在相邻(不能斜着相邻,必须平行于行或列)的两个没有被焊接的小孔上固定。不能固定在已经被整体焊接的行或列上。
安全令牌上最多可以放置多少个芯片,就代表了这个安全令牌对应的校验码。当然,由于安全令牌上小孔的密度会很大,是很难目测出对应的校验码的。你作为商汤科技的实习生,需要写出一个程序,能够自动地算出一个给定的安全令牌的校验码。
输入格式
输入第一行三个整数 n,m(1≤n,m≤100),k(0≤k≤n+m)。
接下来输入 k 行,每行输入两个整数 d(0≤d≤1),c。如果 d=0,表示第 c(1≤c≤n) 行被整体焊接了,如果 d=1,表示第 c(1≤c≤m) 列被整体焊接了。
输出格式
输出安全令牌对应的校验码。
样例输入
4 5 2 0 3 1 4
样例输出
5
AC code:
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
int mm[111][111];
int main()
{
// freopen("D:\\in.txt","r",stdin);
int n,m,k,d,c,i,j,ii,jj,cnt;
scanf("%d%d%d",&n,&m,&k);
memset(mm,0,sizeof(mm));
for(i=1;i<=k;i++)
{
scanf("%d%d",&d,&c);
if(d==0)
{
for(jj=1;jj<=m;jj++)
{
mm[c][jj]=1;
}
}
else
{
for(ii=1;ii<=n;ii++)
{
mm[ii][c]=1;
}
}
}
cnt=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(mm[i][j]==0&&mm[i][j+1]==0&&j+1<=m)
{
cnt++;
mm[i][j]=1;
mm[i][j+1]=1;
}
else if(mm[i][j]==0&&mm[i+1][j]==0&&i+1<=n)
{
cnt++;
mm[i][j]=1;
mm[i+1][j]=1;
}
}
}
printf("%d\n",cnt);
return 0;
}
B. 商汤科技的行人检测(简单)
商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。
在这道题中,我们将行人的移动过程抽象为 平移,有两个 移动参数:dx 和 dy。每次行人的移动过程会将行人对应的所有点全部平移,对于平移前的点 (x,y),平移后的坐标为 (x+dx,y+dy)。
我们现在已知一个行人对应着 n 个点,坐标分别为 (x1,y1),(x2,y2)…(xn,yn),平移后的坐标分别为 (x1′,y1′),(x2′,y2′)…(xn′,yn′)。
很显然,通过平移前后的正确坐标,很容易算出行人的移动参数,但问题没有这么简单。由于行人实际的移动并不会完全按照我们预想的方式进行,因此,会有一部分平移后的坐标结果不正确,但可以确保 结果不正确的坐标数量严格不超过一半。
你现在作为商汤科技的实习生,接手了这个有趣的挑战:算出行人的移动参数。如果不存在一组合法的移动参数,则随意输出一组参数;如果有多种合法的移动参数,输出其中任意一组合法的即可。
输入格式
第一行输入一个整数 n(1≤n≤105),表示行人抽象出的点数。
接下来 n 行,每行 4 个 整数。前两个数表示平移前的坐标,后两个数表示平移后的坐标。
坐标范围在 −109 到 109 之间。
输出格式
一行两个整数,dx 和 dy,表示行人的移动参数。
样例输入
5 0 0 1 1 0 1 1 2 1 0 2 1 1 1 0 0 2 1 1 0
样例输出
1 1
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int dx;
int dy;
}a[100010];
bool cmp(node a,node b)
{
if(a.dx!=b.dx)
return a.dx<b.dx;
else
return a.dy<b.dy;
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int n,x1,y1,x2,y2,i,cnt,fg;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
a[i].dx=x2-x1;
a[i].dy=y2-y1;
}
sort(a,a+n,cmp);
cnt=1;
if(n==1)
printf("%d %d\n",a[0].dx,a[0].dy);
else
{
fg=0;
for(i=1;i<n;i++)
{
if(a[i].dx==a[i-1].dx && a[i].dy==a[i-1].dy)
{
cnt++;
if(cnt>=(n+1)/2)
{
printf("%d %d\n",a[i].dx,a[i].dy);
fg=1;
break;
}
}
}
if(!fg)
{
printf("%d %d\n",a[0].dx,a[0].dy);
}
}
return 0;
}
AC code2:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
int main()
{
int n,x1,x2,y1,y2,i,dx,dy,tx,ty,cnt,cc;
scanf("%d",&n);
cnt=0;
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
dx=x2-x1;
dy=y2-y1;
if(cnt==0)
{
tx=dx;
ty=dy;
cnt++;
}
else
{
if(tx==dx && ty==dy)
cnt++;
else
cnt--;
}
}
printf("%d %d\n",tx,ty);
return 0;
}