2017 计蒜之道 初赛 第四场

181 篇文章 0 订阅
173 篇文章 3 订阅

A. 商汤科技的安全令牌

商汤科技致力于引领人工智能核心“深度学习”技术突破,构建人工智能、大数据分析行业解决方案。作为一家人工智能公司,用机器自动地解决各类实际问题自然不在话下。近日,商汤科技推出了一套安全令牌,令牌如下图所示:

安全令牌上的小孔有 nn 行 mm 列,不过有些行和有些列已经用导线整体焊接了,共有 kk 根导线。

我们可以在安全令牌上 不重叠 地焊接若干个小芯片,每个芯片需要在相邻(不能斜着相邻,必须平行于行或列)的两个没有被焊接的小孔上固定。不能固定在已经被整体焊接的行或列上。

安全令牌上最多可以放置多少个芯片,就代表了这个安全令牌对应的校验码。当然,由于安全令牌上小孔的密度会很大,是很难目测出对应的校验码的。你作为商汤科技的实习生,需要写出一个程序,能够自动地算出一个给定的安全令牌的校验码。

输入格式

输入第一行三个整数 n,m(1 \le n,m \le 100)n,m(1n,m100)k(0 \le k \le n + m)k(0kn+m)

接下来输入 kk 行,每行输入两个整数 d(0 \le d \le 1)d(0d1)cc。如果 d = 0d=0,表示第 c(1 \le c \le n)c(1cn) 行被整体焊接了,如果 d = 1d=1,表示第 c(1 \le c \le m)c(1cm) 列被整体焊接了。

输出格式

输出安全令牌对应的校验码。

样例输入
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 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。

在这道题中,我们将行人的移动过程抽象为 平移,有两个 移动参数d_xdx 和 d_ydy。每次行人的移动过程会将行人对应的所有点全部平移,对于平移前的点 (x, y)(x,y),平移后的坐标为 (x + d_x, y + d_y)(x+dx,y+dy)

我们现在已知一个行人对应着 nn 个点,坐标分别为 (x_1,y_1),(x_2,y_2)\ldots (x_n,y_n)(x1,y1),(x2,y2)(xn,yn),平移后的坐标分别为 (x_1',y_1'),(x_2',y_2')\ldots (x_n',y_n')(x1,y1),(x2,y2)(xn,yn)

很显然,通过平移前后的正确坐标,很容易算出行人的移动参数,但问题没有这么简单。由于行人实际的移动并不会完全按照我们预想的方式进行,因此,会有一部分平移后的坐标结果不正确,但可以确保 结果不正确的坐标数量严格不超过一半

你现在作为商汤科技的实习生,接手了这个有趣的挑战:算出行人的移动参数。如果不存在一组合法的移动参数,则随意输出一组参数;如果有多种合法的移动参数,输出其中任意一组合法的即可。

输入格式

第一行输入一个整数 n(1 \le n \le 10^5)n(1n105),表示行人抽象出的点数。

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

坐标范围在 -10^9109 到 10^9109 之间。

输出格式

一行两个整数,d_xdx 和 d_ydy,表示行人的移动参数。

样例输入
5
0 0 1 1
0 1 1 2
1 0 2 1
1 1 0 0
2 1 1 0
样例输出
1 1
AC code1:

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值