深信服 2022届校园招聘 C++笔试编程题目

试卷情况


试卷包括不定项选择题11道,填空题11道,编程题2道,限时120分钟。


第一道编程题

题目:一个厨师出售1-6六种不同的食物,每种食物都需要使用各自的特殊厨具,厨师的灶台最多只能同时摆放3种厨具,所以厨师决定空间不够时更换最久没使用过的厨具,每种食物烹饪都需要15分钟,更换一次厨具需要6分钟,请计算按点单顺序完成点单列表所需时间。(请使用c语言完成)

输入描述:每行一个数字,1-6代表6种订单,0代表订单开始,7代表结束。

输出描述:一个数字,代表厨师需要的总时间。

备注:应该是考察最近最少使用(LRU)的思想,但不能使用STL容器。

#include <stdio.h>

void swap(int* a, int* b) {
    
    
	int t = *a;
	*a = *b;
	*b = t;
}

int main() {
    
    
	int t;
	scanf_s("%d", &t);
	if (t == 0) {
    
    
		scanf_s("%d", &t);
	}
	int a = t, b = 0, c = 0, ans = 15;
	while (1) {
    
    
		scanf_s("%d", &t);
		if (t == 7) {
    
    
			break;
		}
		ans += 15;
		if (b == 0) {
    
    
			if (a == t) {
    
    
				continue;
			}
			b = t;
			continue;
		}
		if (c == 0) {
    
    
			if (a == t) {
    
    
				swap(&a, &b);
				continue;
			}
			if (b == t) {
    
    
				continue;
			}
			c = t;
			continue;
		}
		if (t == a) {
    
    
			swap(&a, &b);
			swap(&b, &c);
			continue;
		}
		if (t == b) {
    
    
			swap(&b, &c);
			continue;
		}
		if (t == c) {
    
    
			continue;
		}
		swap(&a, &b);
		swap(&b, &c);
		c = t;
		ans += 6;
	}
	printf("%d\n", ans);
	return 0;
}

第二道编程题

题目:小明参加机器人大赛,比赛的场地是一个n*m的方块。现在规定,机器人从左上角出发,前往右下角,因为时间紧张,小明只设计出最简单的智能算法,他的机器人只会向下或者向右。小明现在想知道,一共有多少种方案能到达终点。

输入描述:输入的第一行是两个整数n,m(1≤n,m≤10),接下来的n行有m个数字,数字只会是0或者1,0代表可以通行,1代表障碍物,数据保证终点一定是0。

输出描述:一个整数ans,表示方案数。数据随机生成,且保证答案不超过2^31。

备注:动态规划题,本小白做不出来,后来查到网上有Java题解:https://blog.csdn.net/zhangxxin/article/details/115735641,发现思路还挺简单,我按该思路用C++复现了一遍,感觉自己还是要多练练动态规划。

#include <iostream>
#include <vector>

using namespace std;

int main() {
    
    
	int n, m;
	cin >> n >> m;
	vector<vector<int>> g(n, vector<int>(m, 0));
	vector<vector<int>> dp(n, vector<int>(m, 0));
	int t;
	for (int i = 0; i < n; ++i) {
    
    
		for (int j = 0; j < m; ++j) {
    
    
			cin >> t;
			g[i][j] = t;
		}
	}
	for (int i = 0; i < n; ++i) {
    
    
		if (g[i][0] == 1) {
    
    
			break;
		}
		dp[i][0] = 1;
	}
	for (int i = 0; i < m; ++i) {
    
    
		if (g[0][i] == 1) {
    
    
			break;
		}
		dp[0][i] = 1;
	}
	for (int i = 1; i < n; ++i) {
    
    
		for (int j = 1; j < m; ++j) {
    
    
			if (g[i][j] == 1) {
    
    
				continue;
			}
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
		}
	}
	cout << dp[n - 1][m - 1] << endl;
	return 0;
}


本人只是一名编程小白,写博客是为了总结和交流,恳请大家批评指正!

猜你喜欢

转载自blog.csdn.net/embracestar/article/details/120042649