3G实验室2024级二面题解

本文是3G实验室2024级二面题解,包含小车问题、笨小猴、拯救oibh总部等7道题目。作者分享了自身解题思路和代码实现,如小车问题需数学计算,笨小猴用哈希表解决,拯救oibh总部用深度搜索算法等,借此总结做题经验。

3G实验室2024级二面题解

前言

本次二面题对我自身而言还是十分有难度的,在考核之时只能写出四道,其中题目对我自身代码实现能力,理解题意能力也是一个极大的考验,也借此机会找到自己在学习上的不足。因此将此次二面题目总结为博客一篇,写出我个人对于题目的理解,以此总结自身做题经验,巩固自身进度。


1.小车问题

题目描述

甲、乙两人同时从 A 地出发要尽快同时赶到 B 地。出发时 A 地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。

输入格式

仅一行,三个实数,分别表示 AB 两地的距离 s,人的步行速度 a,车的速度 b。

输出格式

两人同时到达 B 地需要的最短时间,保留 6 位小数。

样例输入 #1
120 5 25
样例输出 #1
9.600000

提示

数据规模与约定

对于 100% 的数据,保证 0≤s,a,b≤10^9。

解题思路

作为第一道签到题,就让我完全没有思路,模拟的过程在代码实现上没有难度,只是在解题上对我来说有数学难度。首先,我们要知道的是,无论采取怎么样的策略,甲乙两个人必将同时到达,即先载乙到半路,再让汽车回头载上甲,使得甲乙到达的时间为相同的。

那么我们假设甲中途的下车点为C,那么:

车从A到C的时间:Ta→c = S / b ;

又由于甲乙的步行速度是一样的,那么就意味着,甲乙的运动路程是对称的,如图

image-20240402183152713

那么这个图一出来,其实方程也不难列出了x/a=(s-2x+s-x)/b,解得x=2as/(3a+b),知道了x,也就不难知道t=x/a+(s-x)/b。OK,知道了如何进行计算,我们马上用代码实现这个过程。

代码实现

#include <stdio.h>
int main() {
   
   
	double a, b, s, t ,x;
	scanf("%lf %lf %lf",&s,&a,&b);
	x=2*a*s/ (3*a+b);
	t= x/a + (s-x)/b;
	printf(" %.6lf ",t);
	return 0;
}

2.笨小猴

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 maxn 是单词中出现次数最多的字母的出现次数,minn 是单词中出现次数最少的字母的出现次数,如果maxn - minn是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 100 100 100

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 maxn-minn 的值,否则输出 0。

样例输入 #1
error
样例输出 #1
Lucky Word
2
样例输入 #2
olympic
样例输出 #2
No Answer
0

解题思路

这道题就是一道简单的用哈希表解决的问题,在考试的时候,没看清题目的要求,导致差值在非质数数还输出他们差值的结果导致最后修改的时候,没来得及重新提交,少拿了八十分,这个故事告诉我们审题需谨慎。(哭脸)

在这道题里面,我们只需要统计给出字符串各自字母的数字,再在哈希表中找出最大和最小值的,再进行一个简单的质数判断。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int num(int nums){
   
   
	if(nums == 0||nums == 1){
   
   
		return 0;
	}
	for(int i=2;i<= sqrt(nums)/2;i++){
   
   
		if(nums%i==0){
   
   
			return 0;
		}
	}	
	return 1;
}
int main() {
   
   

	
	char s[100];
	scanf("%s",s);
	int len = strlen(s);
	int hash[26]={
   
   0};
	for(int i=0;i<len;i++){
   
   
		hash[s[i]-'a']++;
	}
	int max=0,min=100;
	for(int i=0;i<26;i++){
   
   
		if(hash[i]==0){
   
   
			continue;
		}
		max=fmax(hash[i],max);
		min=fmin(hash[i],min);
	}
	int res = max-min;
	if(num(res)){
   
   
		printf("Lucky Word\n");
		printf("%d\n",res);
		return 0;
	}

	printf("No Answer\n");
	printf("0\n");
	return 0;
}

顺带提一句,这个质数的判断显然不是算法的最优解,通过埃式筛能够更快的进行相关质数的筛查。

void sieve_of_eratosthenes(int n) {
   
   
    // 创建一个数组,用于标记是否为素数
    int prime[n+1];
    // 初始化数组,假定所有数都是素数
    for (int i = 0; i <= n; i++) {
   
   
        prime[i] = 1;
    }
    prime[0] = 0, prime[1] = 0;
    // 埃拉托斯特尼筛法
    for (int i = 2; i <= sqrt(n); i++) {
   
   
        if (prime[i]) {
   
   
            for (int j = i * i; j <= n; j += i) {
   
   
                prime[j] = 0; // 将i的倍数标记为非素数
            }
        }
    }
}

3.拯救oibh总部

题目背景

oibh 总部突然被水淹没了!现在需要你的救援……

题目描述

oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示,而一个四面被围墙围住的区域洪水是进不去的。

oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0 表示。

现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。

输入格式

第一行为两个正整数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值