2017计蒜之道初赛第四场AB两题题解

本文介绍了两道算法题目:一是关于如何计算安全令牌的最大校验码,涉及矩阵分割和深度优先搜索;二是行人检测中的平移参数计算,利用众数统计解决容错问题。

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

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

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

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

输入格式

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

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

输出格式

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

样例输入
4 5 2
0 3
1 4
样例输出
5



解题思路:安全令牌分割成为若干个独立的矩形区域。一个矩形区域如果长和宽都是奇数,那么就会多出一个小孔,否则每个小孔都能用上。

#include
  
   
#define MAXSIZE 100
int map[MAXSIZE+1][MAXSIZE+1],n,m;
int dfs(int i,int j){
	if(i<=0||i>n||j<=0||j>m){
		return 0;
	}
	if(map[i][j]==1){
		return 0;
	}
	else{
		map[i][j]=1;
		return 1+dfs(i+1,j)+dfs(i,j+1);
	}
}
int main()
{
	int k,i,j,count=0,d,c;
	scanf("%d %d %d",&n,&m,&k);
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			map[i][j]=0;
		}
	}
	for(i=0;i
   
  


B题:

商汤科技近日推出的 SenseVideo 能够对视频监控中的对象进行识别与分析,包括行人检测等。在行人检测问题中,最重要的就是对行人移动的检测。由于往往是在视频监控数据中检测行人,我们将图像上的行人抽象为二维平面上若干个的点。那么,行人的移动就相当于二维平面上的变换。

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

我们现在已知一个行人对应着 n n 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) (x1,y1),(x2,y2)(xn,yn),平移后的坐标分别为 ( 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') (x1,y1),(x2,y2)(xn,yn)

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

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

输入格式

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

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

坐标范围在 − 1 0 9 -10^9 109 1 0 9 10^9 109 之间。

输出格式

一行两个整数, d x d_x dx d y d_y dy,表示行人的移动参数。

样例输入
5
0 0 1 1
0 1 1 2
1 0 2 1
1 1 0 0
2 1 1 0
样例输出
1 1
解题思路:

本题给定 n n n 对变换前后的二维点,要求在有一定容错(错误的点对数严格不超过一半)的情况下,对变换进行复原。其关键条件在于对容错率的限制:错误的点对数严格不超过一半。由于只有平移,我们可以首先计算出每对点对应的平移量。由于错误的点对数严格不超过一半,我们可以直接统计 n n n 组平移量中的众数,即可得到答案。

本题还可以通过限制内存,要求大家在常数内存下完成。只需要一个计数器和一个与计数器对应的平移量即可。每次读入一个点对,计算新的平移量。

(1)若此时计数器为 0 0 0,则存下这个平移量,计数器修改为 1 1 1

(2)若此时计数器不为 0 0 0,则检查是否与存着的平移量相同:如果相同,则计数器加一;否则减一。最终幸存下来的平移量即为答案。

#include
  
   
typedef struct{
	int x;
	int y;
	int num;
}node;
node str[100001];
int count=0;
int main()
{
	int n,i,j,a,b;
	int x1,x2,x3,x4,flag;
	scanf("%d",&n);
	for(i=0;i
   
    =n){
			printf("%d %d",str[i].x,str[i].y);
			break;
		}
	}
}
   
  

### 关于2024百度之星初赛第一场的题目解析 目前尚未有官方发布的关于2024百度之星初赛第一场的具体题目解析文档被广泛传播或公开引用。然而,基于以往的比赛惯例以及社区讨论的内容[^1],可以推测该比赛通常涉及算法、数据结构应用以及编程技巧等方面的知识。 #### 题目类型分析 根据过往几年百度之星竞赛的特点,其题目可能涵盖但不限于以下几个方面: - **字符串处理**:此类问题经常考察参赛者对于复杂模式匹配的理解能力,例如KMP算法的应用场景或者正则表达式的高效实现方法。 - **动态规划 (Dynamic Programming)**:这是解决最优化问题的一种重要手段,在许多比赛中都会出现。它通过把原问题分解成相对简单的子问题来求解复杂问题的方法[^2]。 - **图论(Graph Theory)**:包括但不限于最小生成树(MST),单源最短路径(SSSP)等问题都是常见考点之一。这些都需要扎实的基础理论支持才能快速找到最优解答方案[^3]。 以下是针对假设性的几类典型问题提供一些通用思路和技术要点说明: --- #### 字符串处理案例解析 如果遇到需要频繁查询某个特定字符序列是否存在的情况,则可考虑构建AC自动机来进行批量检索操作;而对于仅需判断两个字符串之间关系的任务来说,双指针技术往往能够满足需求并保持较低时间复杂度O(n)[^4]。 ```python def is_subsequence(s, t): it = iter(t) return all(char in it for char in s) # Example Usage: print(is_subsequence("abc", "ahbgdc")) # Output: True ``` --- #### 动态规划实例讲解 当面临背包问题变种或是区间覆盖等相关挑战时,定义状态转移方程至关重要。比如经典的一维数组形式dp[i]=max(dp[i], dp[j]+w(i,j))表示从前j项选取若干物品放入容量不超过i的情况下所能获得的最大价值总和[^5]。 ```python def knapsack(weights, values, capacity): n = len(values) dp = [0]*(capacity+1) for i in range(1,n+1): w,v=weights[i-1],values[i-1] for j in reversed(range(capacity+1)): if j >=w : dp[j]= max(dp[j], dp[j-w]+v ) return dp[-1] # Example Usage: weights=[2,3,4] values =[3,4,5] capacity=5 result=knapsack(weights,values,capacity) print(result) # Output:7 ``` --- #### 图论基础概念复习 在面对连通性验证或者是寻找关键节点这样的任务时,BFS/DFS遍历配合并查集Union-Find的数据结构通常是首选策略。它们能够在几乎线性时间内完成大规模网络拓扑属性算工作[^6]。 ```python from collections import defaultdict, deque class Graph: def __init__(self): self.graph = defaultdict(list) def addEdge(self,u,v): self.graph[u].append(v) self.graph[v].append(u) def BFS(self,start_vertex): visited=set() queue=deque([start_vertex]) while(queue): vertex=queue.popleft() if(vertex not in visited): visited.add(vertex) queue.extend(set(self.graph[vertex])-visited) return list(visited) g=Graph() edges=[[0,1],[0,2],[1,2],[2,3]] for u,v in edges:g.addEdge(u,v) res=g.BFS(2) print(res) #[2, 0, 1, 3] ``` 尽管以上只是部分可能涉及到的技术领域概述及其简单示例展示,但对于准备参加类似赛事的学习者而言已经具备相当指导意义了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值