2023 蚂蚁笔试题 0404
笔试时间:2023年4月4日 春招实习
第一题
题目:正直者与欺诈者
有n个人,其中一些人是正直者,另外—些人是欺诈者。已知正直者永远说真话,欺诈者永远说假话。现在你已经知道了每个人是正直者还是欺诈者。有q次询问,每次询问你需要回答x指证y是正直者还是欺诈者。
输入描述
第一行输入一个正整数n,代表人数。
第二行输入一个长度为n的字符串,第i个字符为'H'代表第i个人是正直者,'L'代表欺诈者。
第三行输出一个正整数q,代表询问的次数。
接下来的行,每行输入两个正整数a和y,代表一次询问。
1 ≤n,q≤ 104
1 ≤x, y ≤n
x≠y
输出描述
输出q行,分别代表每次指证的结果。
若x指证y是正直者,则输出"honester"。如果是欺诈者,则输出"liar" 。
样例输入
5
HLHHL
3
1 2
2 3
3 4
样例输出
liar
liar
honester
第一个人是正直者,他会说真话,因此他指证第二个人是欺诈者。
第二个人是欺诈者,他会说假话,因此他指证第三个人是欺诈者。
第三个人是正直者,他会说真话,因此他指证第四个人是正直者。
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
string people;
cin >> people;
int q;
cin >> q;
for (int i = 0; i < q; ++i) {
int x, y;
cin >> x >> y;
if (people[x - 1] == 'H') {
if (people[y - 1] == 'H') {
cout << "honester" << endl;
} else {
cout << "liar" << endl;
}
} else {
if (people[y - 1] == 'H') {
cout << "liar" << endl;
} else {
cout << "honester" << endl;
}
}
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String people = scanner.next();
int q = scanner.nextInt();
for (int i = 0; i < q; ++i) {
int x = scanner.nextInt();
int y = scanner.nextInt();
if (people.charAt(x - 1) == 'H') {
if (people.charAt(y - 1) == 'H') {
System.out.println("honester");
} else {
System.out.println("liar");
}
} else {
if (people.charAt(y - 1) == 'H') {
System.out.println("liar");
} else {
System.out.println("honester");
}
}
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
people = [c for c in input()]
q = int(input())
for _ in range(q):
x, y = map(int, input().split(" "))
if people[x - 1] == 'H':
if people[y - 1] == 'H':
print("honester")
else:
print("liar")
else:
if people[y - 1] == 'H':
print("liar")
else:
print("honester")
第二题
题目:小红的红子树
小红拿到了—棵有根树,树的根节点为1号节点。小红将一些节点染成了红色。她想知道有多少子树满足子树所有节点均为红色?
输入描述
第一行输入一个正整数n,代表节点的数量;
第二行输入一个长度为n的字符串,第i个字符为'R'代表第i个节点被染成红色,为'w'代表未被染色;
接下来的n ― 1行,每行输入两个正整数x和y,代表x和y有一条边连接;
1<n≤10^5
1 ≤x, y ≤n
输出描述
输出一个整数,代表节点均为红色的子树数量。
样例输入
3
WRR
1 2
1 3
样例输出
2
节点2和节点3均合法
参考题解
dfs遍历树,向上返回的是以当前节点为根的子树是否满足全部节点为红色即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int n;
unordered_map<int, vector<int>> nxs;
vector<char> colors;
int cnt = 0;
bool dfs(int node, int pre) {
bool cur = (colors[node] == 'R');
if (nxs.count(node)) {
for (int nx : nxs[node]) {
if (nx != pre) {
cur = dfs(nx, node) && cur;
}
}
}
if (cur) cnt++;
return cur;
}
int main() {
cin >> n;
colors.resize(n + 1);
for (int i = 1; i <= n; i++) cin >> colors[i];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
nxs[u].push_back(v);
nxs[v].push_back(u);
}
dfs(1, -1);
cout << cnt << endl;
return 0;
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
nxs = {}
colors = [0] + [c for c in input()]
for _ in range(n-1):
u,v = map(int, input().split(" "))
if u not in nxs: nxs[u] = []
if v not in nxs: nxs[v] = []
nxs[u].append(v
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
查看22道真题和解析