众安笔试 众安笔试题 0321

笔试时间:2025年03月21日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目

街边有n个行人,每个人有一个初始朝向ai∈{0,1}。 ai=0代表他向左行走,ai=1代表她向右行走。第i个人的坐标为xi,行走速度均相同,且不存在两个人的初始位置重合。在经过了足够漫长的时间后,有一些人会相遇。一次相遇即:在某一时刻,两个人的坐标重合。现在想请你求出:有多少对人发生了相遇。

输入描述

第一行一个整数n。

接下来n行,每行两个整数,表示 xi和ai。

输出描述

输出一个整数,表示答案。

样例输入

3

1 1

2 0

3 1

样例输出

1

说明:相遇的人是1和2。其他的两对无法相遇。

参考题解

排序+二分查找。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> left, right;

    for (int i = 0; i < n; ++i) {
        int x, a;
        cin >> x >> a;
        if (a == 0)
            left.push_back(x);
        else
            right.push_back(x);
    }

    sort(left.begin(), left.end()); // 升序排列左行人

    long long count = 0;
    for (int x : right) {
        // 使用 lower_bound 寻找第一个 > x 的位置
        int index = lower_bound(left.begin(), left.end(), x) - left.begin();
        count += left.size() - index;
    }

    cout << count << endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {
  public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      int n = in.nextInt();
      List<Integer> left = new ArrayList<>();
      List<Integer> right = new ArrayList<>();
      
      for (int i = 0; i < n; i++) {
          int x = in.nextInt();
          int a = in.nextInt();
          if (a == 0) {
              left.add(x);
          } else {
              right.add(x);
          }
      }
      
      Collections.sort(left); // 对左行人坐标升序排序
      
      long count = 0;
      for (int x : right) {
          // 二分查找第一个大于x的坐标位置
          int index = Collections.binarySearch(left, x);
          if (index < 0) {
              index = -(index + 1); // 转换为插入点
          }
          count += left.size() - index; // 统计右侧所有左行人的数量
      }
      
      System.out.println(count);
  }
}

Python:[此代码未进行大量数据的测试,仅供参考]

import bisect

n = int(input())

left = []
right = []

for _ in range(n):
    x, a = map(int, input().split())
    if a == 0:
        left.append(x)
    else:
        right.append(x)

left.sort()  # 升序排列左行人

count = 0
for x in right:
    index = bisect.bisect_right(left, x - 1)
    count += len(left) - index

print(count)

第二题

题目

小红拿到了一个n行n列的矩阵,她每次操作可以将一个元素加1。 小红想知道,自己最少操作多少次之后,可以使得矩阵变成好矩阵? 好矩阵的定义:当一个矩阵顺时针旋转0度、90度、180度、270度时,所得到的矩阵是相同的。 例如,矩阵a为:

1 2 3

4 5 6

7 8 9

它顺时针旋转90度之后就变成:

7 4 1

8 5 2

9 6 3

输入描述

第一行输入一个正整数n,代表矩阵的行数和列数。

接下来的n行,每行输入n个正整数,用来表示矩阵的元素。

输出描述

输出一个整数表示最少操作次数。

样例输入

2

1 2

3 4

样例输出

6

说明:

这四个元素需要变成同一个数,最大值是4。总操作次数是6。

参考题解

对称组划分:每个元素与旋转后的三个元素组成一个对称

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务