米哈游笔试题目思路(客户端卷)

考场一小时就速通交卷了,发个考场AC代码。肯定还能优化,轻喷。代码一题比一题短。。。

1.矩阵连通块

思路两次dfs,一次是正常的,一次是按照B和G等价来看。

#include<iostream>

using namespace std;

int n, m;
string s[1010];
bool vis1[1010][1010], vis2[1010][1010];
const int mv[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

int dfs1(int x, int y) {
	if(x < 0 || x >= n) return 0;
	if(y < 0 || y >= m) return 0;
	if(vis1[x][y]) return 0;
	if(!vis1[x][y]) vis1[x][y] = true;
	for(int i = 0; i < 4; i++) {
		if(x + mv[i][0] < 0 || x + mv[i][0] >= n) continue;
		if(y + mv[i][1] < 0 || y + mv[i][1] >= m) continue;
		if(s[x + mv[i][0]][y + mv[i][1]] == s[x][y])
			dfs1(x + mv[i][0], y + mv[i][1]);
	}
	return 1;
}
int dfs2(int x, int y) {
	if(x < 0 || x >= n) return 0;
	if(y < 0 || y >= m) return 0;
	if(vis2[x][y]) return 0;
	if(!vis2[x][y]) vis2[x][y] = true;
	for(int i = 0; i < 4; i++) {
		if(x + mv[i][0] < 0 || x + mv[i][0] >= n) continue;
		if(y + mv[i][1] < 0 || y + mv[i][1] >= m) continue;
		if(s[x][y] == 'G' || s[x][y] == 'B') {
			if(s[x + mv[i][0]][y + mv[i][1]] == 'G' || s[x + mv[i][0]][y + mv[i][1]] == 'B')
				dfs2(x + mv[i][0], y + mv[i][1]);
		}
		else if(s[x + mv[i][0]][y + mv[i][1]] == s[x][y])
			dfs2(x + mv[i][0], y + mv[i][1]);
	}
	return 1;
}
int main() {
	cin >> n >> m;
	for(int i = 0; i < n; i++) {
		cin >> s[i];
	}
	int cnt = 0;
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			cnt += dfs1(i, j);
		}
	}
	
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			cnt -= dfs2(i, j);
		}
	}
	
	cout << cnt;
	return 0;
}

2.mhy字符串

手动玩一下可以发现mhy这三个字的顺序没有任何关系。

例如:yhm->mhyhmy->mhyhmy->hym

然后hym通过类似的操作就可以变成mhy,因此这个插入删除就等价于无序插入删除而且可以随意调整已有的顺序。

然后只需要比较mhy之外的字符串是否相等,已经mhy三个字符之间的数量关系。

#include <bits/stdc++.h>

using namespace std;

int bin_s[3], bin_t[3];

int main() {
	int T;
	cin >> T; 
	while(T--) {
		bin_s[0] = bin_s[1] = bin_s[2] = 0;
		bin_t[0] = bin_t[1] = bin_t[2] = 0;
		string s, t;
		cin >> s >> t;
		string new_s, new_t;
		for(int i = 0; i < (int) s.length(); i++) {
			if(s[i] == 'm') bin_s[0]++;
			else if(s[i] == 'h') bin_s[1]++;
			else if(s[i] == 'y') bin_s[2]++;
			else new_s.push_back(s[i]);
		}
		for(int i = 0; i < (int) t.length(); i++) {
			if(t[i] == 'm') bin_t[0]++;
			else if(t[i] == 'h') bin_t[1]++;
			else if(t[i] == 'y') bin_t[2]++;
			else new_t.push_back(t[i]);
		}
		if(new_s == new_t) {
			if(bin_s[0] - bin_t[0] == bin_s[1] - bin_t[1] 
			&& bin_s[0] - bin_t[0] == bin_s[2] - bin_t[2])
				cout << "Yes" << endl;
			else cout << "No" << endl;
		}
		else cout << "No" << endl;
	}
	return 0;
}

3.子集合计数

简单O(nsqrt(a))的dp,排序之后dp[i]代表以a[i]结尾的数的集合数量。那么dp[i]只需要从所有a[i]的因数处转移,因为集合不可重复,所以可以排序之后令pos[a[i]] = i,没有的就-1,所以sqrt(a[i])枚举一下因数,用pos桶查坐标,都加上就行。

#include <bits/stdc++.h>

using namespace std;

const long long M = 1000000007;
int a[100010], pos[1000010];
int dp[100010];

int main() {
	memset(pos, -1, sizeof(pos));
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	sort(a, a + n);
	for(int i = 0; i < n; i++) {
		pos[a[i]] = i;
	}
	long long ans = 0;
	for(int i = 0; i < n; i++) {
		int tmp = a[i];
		for(int j = 1; j * j <= tmp; j++) {
			if(tmp % j == 0) {
				if(pos[tmp / j] > -1 && j != tmp / j) {
					dp[i] += dp[pos[tmp / j]];
				}
				if(pos[j] > -1) {
					dp[i] += dp[pos[j]];
				}
			}
		}
		ans += dp[i];
		ans %= M;
		dp[i]++;
	}
	cout << ans;
	return 0;
}

#米哈游##米哈游2023春招求职进度交流#
全部评论
大佬我咋没看懂你的这个例子表达的意思,例如:yhm->mhyhmy->mhyhmy->hym,能细说一下嘛
2 回复 分享
发布于 2023-03-20 10:19 北京
大佬太强了,搞不定搞不定,我已经和米哈游无缘了😹
1 回复 分享
发布于 2023-03-20 07:40 美国
大佬,求问为什么需要dp[i]++呀, ans += dp[i]; ans %= M; dp[i]++;
点赞 回复 分享
发布于 2023-04-13 10:45 广东
为什么我也是客户端结果和你一道题也不一样,每道都好难的那种
点赞 回复 分享
发布于 2023-03-20 13:50 浙江
tql
点赞 回复 分享
发布于 2023-03-20 11:58 上海
第三题复杂度不对
点赞 回复 分享
发布于 2023-03-20 11:31 浙江
第三题我理解错了,我以为求等比数列的个数,怎么都没写出来,睡前突然想明白题目不是指等比数列
点赞 回复 分享
发布于 2023-03-20 10:48 陕西

相关推荐

03-24 12:36
门头沟学院 Java
秋招跑了大半年,前前后后做了几十家公司的笔试,从互联网大厂到量化私募,从国企总行到游戏公司,真的见识了什么叫&nbsp;“没有最难,只有更难”。1.&nbsp;头部量化私募(九坤、幻方、灵均、宽德)难度天花板,没有之一,能完整做完的都是真大神。难在哪里:题型极其硬核,完全不是互联网笔试的量级。除了超难的算法题(普遍是&nbsp;LeetCode&nbsp;Hard&nbsp;+&nbsp;难度,还会涉及竞赛题),还有大量的概率论、线性代数、随机过程、高数证明题,甚至还有&nbsp;C++&nbsp;底层原理、Linux&nbsp;内核相关的硬核选择题,对数学和编程功底的要求拉到极致。真实体感:我做九坤的笔试,120&nbsp;分钟,10&nbsp;道选择&nbsp;+&nbsp;3&nbsp;道编程&nbsp;+&nbsp;2&nbsp;道证明题,选择题一半靠蒙,编程题一道没完整&nbsp;AC,证明题直接空着,考完直接怀疑人生,非科班&nbsp;+&nbsp;数学功底弱的,直接会被劝退。2.&nbsp;华为「天才少年计划」/&nbsp;高端岗位笔试普通&nbsp;OD&nbsp;岗的笔试难度就不低,天才少年&nbsp;/&nbsp;高端研发岗的笔试,更是地狱级。难在哪里:题量超大,难度拉满,对代码的时间、空间复杂度要求极其严格。通常是&nbsp;5&nbsp;道算法题,150&nbsp;分钟,几乎全是&nbsp;Hard&nbsp;难度,涉及动态规划、图论、复杂模拟、数据结构设计,很多题都有隐藏坑,暴力解法直接超时,必须想到最优解才能&nbsp;AC。真实体感:身边的&nbsp;985&nbsp;硕学长,刷了&nbsp;600&nbsp;多道&nbsp;LeetCode,做华为高端岗的笔试,也只&nbsp;AC&nbsp;了&nbsp;2&nbsp;道半,对边界情况的处理、代码优化能力的要求,远比普通大厂高得多。3.&nbsp;腾讯游戏&nbsp;/&nbsp;米哈游&nbsp;游戏客户端&nbsp;/&nbsp;引擎开发岗笔试游戏圈的笔试,是出了名的难,完全是另一个维度的考核。难在哪里:不只是考算法,更是考游戏开发的硬核功底。题型覆盖&nbsp;C++&nbsp;底层原理、计算机图形学、OpenGL/DirectX、物理引擎、数据结构、操作系统,还有超难的算法编程题,很多题都是针对游戏开发场景设计的,没接触过的话,连题干都读不懂。真实体感:做米哈游的客户端开发笔试,选择题一半都是图形学和&nbsp;C++&nbsp;内存管理的硬核题,编程题考了游戏里的碰撞检测算法,完全没接触过的话,根本无从下手,非游戏开发方向的,大概率会直接交白卷。4.&nbsp;字节跳动&nbsp;算法岗&nbsp;/&nbsp;后端开发岗笔试互联网大厂里,字节的笔试难度是公认的第一梯队,虐哭了无数校招生。难在哪里:题量超大,时间极紧,难度梯度离谱。通常是&nbsp;40&nbsp;道行测&nbsp;+&nbsp;4&nbsp;道算法题,120&nbsp;分钟完成。行测题烧脑耗时间,算法题&nbsp;2&nbsp;道中等&nbsp;+&nbsp;2&nbsp;道&nbsp;Hard,几乎没有送分题,对做题速度和心态都是极致的考验,很多人行测就耗掉了一大半时间,算法题根本没时间写。真实体感:秋招做字节的后端笔试,行测就做了&nbsp;50&nbsp;分钟,剩下的时间&nbsp;4&nbsp;道算法题,只&nbsp;AC&nbsp;了&nbsp;1&nbsp;道半,身边很多同学都是全程被按在地上摩擦,能&nbsp;AC3&nbsp;道以上的,都能被称为大神。5.&nbsp;六大行总行&nbsp;/&nbsp;政策性银行&nbsp;科技岗笔试非技术岗里的地狱难度,难在离谱的题量和无所不包的考点。难在哪里:和互联网公司完全不同,不只是考编程,考点覆盖行测、英语、计算机专业知识(计算机网络、操作系统、数据库、组成原理、C++/Java)、金融知识、时政、常识,甚至还有性格测试,题量能到&nbsp;200&nbsp;多道,考试时间&nbsp;3&nbsp;个小时,全程手不停,做到最后眼睛都花了。真实体感:做某国有大行总行的科技岗笔试,3&nbsp;个小时,200&nbsp;多道题,英语还有&nbsp;10&nbsp;道完形填空&nbsp;+&nbsp;5&nbsp;篇阅读理解,计算机专业知识考得又偏又细,做到最后手都酸了,连蒙带猜才勉强做完,考完直接脑子一片空白。最后想跟牛友们说,笔试只是秋招的一关,哪怕考崩了也不用自我否定,很多笔试的通过率本来就极低,不是你不够优秀。
你做过最难的笔试是哪家公...
点赞 评论 收藏
分享
评论
30
88
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务