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 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

1 2 评论
分享
牛客网
牛客企业服务