360 2020秋招笔试真题
360 2020秋招笔试真题
1、表面积
【题目描述】将长N*M厘米的矩形区域划分成N行M列(每行每列的宽度均为1厘米),在第i行第j列的位置上叠放Ai,j个边长为1厘米的正方体(1≤Ai,j≤100),所有正方体就组成了一个立体图形,每个正方体六个面中的一部分会被其它正方体遮挡,未被遮挡的部分的总面积即为该立体图形的表面积,那么该立体图形的表面积是多少平方厘米?
输入描述
第一行包含两个整数N和M,1≤N,M≤1000。
接下来N行,每行包含M个整数,第i行的第j个整数表示Ai,j。
输出描述
输出表面积的大小。
输入样例
2 2 2 1 1 1
输出样例
20
【解题思路】
几何题。统计处理遮挡和深度部分。
【参考代码】
#include <bits/stdc++.h> #define N 1007 using namespace std; int n, m, a[N][N]; int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) scanf("%d", &a[i][j]); int ans = n * m * 2; for (int i = 1; i <= n; ++i) { ans += a[i][1] + a[i][m]; for (int j = 2; j <= m; ++j) if (a[i][j] > a[i][j - 1]) ans += a[i][j] - a[i][j - 1]; for (int j = 1 if (a[i][j] > a[i][j + 1]) ans += a[i][j] - a[i][j + 1]; } for (int i = 1; i <= m; ++i) { ans += a[1][i] + a[n][i]; for (int j = 2; j <= n; ++j) if (a[j][i] > a[j - 1][i]) ans += a[j][i] - a[j - 1][i]; for (int j = 1; j < n; ++j) if (a[j][i] > a[j + 1][i]) ans += a[j][i] - a[j + 1][i]; } printf("%d", ans); }
2、序列重组
【题目描述】在一个古老的国度,这个国家的人并不懂得进位,但是对取模情有独钟,因此诞生了一个经典的问题,给出两个在m进制下含有n位的数字,你可以分别将这两个数各位上的数字重新排列,然后将两个数按位对应相加并分别对m取模,这样显然可以得到一个新的m进制下的n位数(可能存在前导0),但是这个结果是不唯一的,问题来了,按照这样的操作,能够得到的最大的m进制下的数字是多少呢。
输入描述
输入第一行包含两个正整数n,m分别表示数字含有n位,和在m进制下。(n,m≤100000)
输入第二行和第三行分别包含n个整数,中间用空格隔开,每个整数都在0到m-1之间。每行第i个数表示的是当前数第i位上的数字。
输出描述
输出包含n个数字,中间用空格隔开,表示得到的最大的数字,从高位到低位输出,如6在2进制下输出3位的结果是1 1 0。
输入样例
5 5 4 4 1 1 1 4 3 0 1 2
输出样例
4 4 3 3 2
【解题思路】
统计两个数每个数字出现的次数,从小到大对a的数位进行枚举,对应得贪心的使用b的数位去匹配相加,最终得到答案。
【参考代码】
#include <bits/stdc++.h> using namespace std; const int maxn = 1000005; int a[maxn], b[maxn], c[maxn]; stack<int> st; int main() { int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { int x; cin >> x; a[x % m]++; } for (int i = 0; i < n; i++) { int x; cin >> x; b[x % m]++; } for (int k = 0; k < 2; k++) f
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题。 内容中包含多个名企的笔试真题,附有题目思路及参考代码 本专刊购买后即可解锁所有章节,故不可以退换哦~ <