智算之道初赛第二场

本文深入解析了三道ACM竞赛题目,包括A声控灯的条件判断与优化,B构造字符串的思维挑战,以及C情报战中并查集的应用。通过详细代码与思考过程,分享了解题技巧与数据结构优化方法。

题目链接

来写一下蒟蒻第一次ak的题
我是菜鸡

A 声控灯

这个题就是各种条件的判断,一开始有些情况没想到,写了四五遍才过,最后删掉一些不必要的语句加上优化跑了1ms
至于大佬们0ms我办不到了我太难了

情况大概有这些
m >= 1 && m <= 3所以可以从m开始分类讨论
当 m == 1 时,由于题目说一定符合实际情况,所以这个时候 n 只能等于1,这个时候答案 ans = 1
当 m == 2 时,我们很容易就能想到当小明在一楼或者顶楼的时候是亮两个灯的。但是还有一种答案不确定的情况,在这个地方卡了我两次 就是如果一共只有两层楼呢,这个时候亮两个灯也是合理的,但是在这个时候,我们无法得出小明到底在几楼,你说他在一楼可以,说他在二楼也可以。
当 m == 3 时,这个时候直接就可以得出小明在中间的那个楼层,又因为题目说一定符合实际情况,所以不用判断这三个数是否相差1

这样代码就写出来了,经过优化蒟蒻的代码也终于跑到了1ms

int T,n,m;
int a[5];
int ans;

int main(){
	
	io >> T;
	while(T--){
		
		io >> n >> m;
		for(int i=1;i<=m;i++) io >> a[i];
		if(m == 1 && n == 1) ans = 1;
		else if(m == 2){
			if(n == 2) ans = -1;
			else{
				if(a[1] == 1 && a[2] == 2) ans = 1;
				else if(a[1] == n-1 && a[2] == n) ans = n;
			}
		} 
		else ans = a[2];
		printf("%d\n",ans);
	}
	return 0;
}

B 构造字符串

一道思维题吧

ll n,x;
int main(){
	
	scanf("%d",&n);
	ll sum = 0;
	for(int i=0;i<26;i++){
		scanf("%d",&x);
		sum += x/n;
	}
	cout << sum << endl;
	return 0;
}

C 情报战

一开始直接按照题目的思路去写,结果只得了20分,后来就开始想用数据结构来优化,突然发现可以用并查集来实现。
我只需要把我知道的数存在一个集合中,让他成为一棵树。每次去判断给出的x的根节点是否已经存在于这棵树中,存在的话就说明我已经知道这个数,不存在的话就更新答案。同理当给出 x 和 y 的和时,如果 x 的根节点存在 y 的根节点不存在,我们就可以得出 y 的值,所以更新答案;如果 y 的根节点存在而 x 的根节点不存在,我们就可以得出 x 的值,此时更新答案。每次输出这个答案即可

关于并查集的理解和一些操作
强推一下b站大佬的视频,讲的巨仔细

传送门

int n,m,fa[maxn],sz[maxn],vis[maxn];

int find(int x){
	return fa[x] = fa[x] == x ? x : find(fa[x]);
}

void Union(int x,int y){
	int fx = find(x) , fy = find(y);
	if(fx != fy){
		fa[fx] = fy;
		sz[fy] += sz[fx];
		if(vis[fx]) vis[fy] = 1;
	}
}

int main(){
	
	io >> n >> m;
	for(int i=1;i<=n;i++){
		fa[i] = i;
		sz[i] = 1;
	}
	
	int op,x,y,ans = 0;
	while(m--){
		io >> op >> x;
		if(op == 1){
			int fx = find(x); 
			if(vis[fx] == 0){
				ans += sz[fx];
				vis[fx] = 1;
			}
		}else{
			io >> y;
			if(x == y){
				int fx = find(x);
				if(vis[fx] == 0){
					ans += sz[fx];
					vis[fx] = 1;
				}
			}else{
				int fx = find(x) , fy = find(y);
				if(vis[fx] == 0 && vis[fy] == 1){
					ans += sz[fx];
				}else if(vis[fx] == 1 && vis[fy] == 0){
					ans += sz[fy];
				}
				Union(x,y);
			}
		}
		printf("%d\n",ans);
	}	
	return 0;
}

### 关于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] ``` 尽管以上只是部分可能涉及到的技术领域概述及其简单示例展示,但对于准备参加类似赛事的学习者而言已经具备相当指导意义了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你数过天上的星星吗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值