首页 > 编程语言 >结队编程 - 华为OD统一考试(D卷)

结队编程 - 华为OD统一考试(D卷)

时间:2024-08-08 17:25:44浏览次数:10  
标签:gt 结队 level int OD lt ++ 华为 right

OD统一考试(D卷)

分值: 200分

题解: Java / Python / C++

华为od机试真题

题目描述

某部门计划通过结队编程来进行项目开发,已知该部门有 N 名员工,每个员工有独一无二的职级,每三个员工形成一个小组进行结队编程,结队分组规则如下:

从部门中选出序号分别为 i、j、k 的3名员工,他们的职级分别为 level[i],level[j],level[k],结队小组满足 level[i] < level[j] < level[k] 或者 level[i] > level[j] > level[k],其中 0 ≤ i < j < k < n。

请你按上述条件计算可能组合的小组数量。同一员工可以参加多个小组。

输入描述

第一行输入:员工总数 n

第二行输入:按序号依次排列的员工的职级 level,中间用空格隔开

备注:

1 <= n <= 6000

1 <= level[i] <= 10^5

输出描述

可能结队的小组数量

示例1

输入:
4
1 2 3 4

输出:
4

说明:
可能结队成的组合(1,2,3)、(1,2,4)、(1,3,4)、(2,3,4)

示例2

输入:
3
5 4 7

输出:
0

说明:
根据结队条件,我们无法为该部门组建小组

题解

此解法是在暴力的基础上进行了优化。

我们考虑预处理每个员工左侧和右侧的符合条件的员工数量。具体来说,对于每个员工,我们需要知道其左侧和右侧大于和小于其职级的员工数量。然后,通过这些预处理的数量来快速计算满足条件的组合数量。

虽然对于最大值6000可能会超时,但是可以获得大多数分数(C++可以AC95%比暴力解法得分更高)。

具体步骤

  1. 预处理:使用两次遍历分别计算每个员工左侧和右侧大于和小于其职级的员工数量。
  2. 计算组合数量:根据预处理的结果,快速计算满足条件的组合数量。

时间复杂度:使用两次遍历分别计算每个员工左侧和右侧大于和小于其职级的员工数量,因此时间复杂度为 O(n^2)。

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] levels = new int[n];
        for (int i = 0; i < n; i++) {
            levels[i] = scanner.nextInt();
        }

        int[] leftGt = new int[n];
        int[] leftLt = new int[n];
        int[] rightGt = new int[n];
        int[] rightLt = new int[n];

        // 计算左右侧大于和小于当前员工职级的员工数量
        for (int l = 0; l < n; l++) {
            for (int r = l + 1; r < n; r++) {
                if (levels[l] < levels[r]) {
                    leftLt[r]++;
                    rightGt[l]++;
                } else {
                    leftGt[r]++;
                    rightLt[l]++;
                }
            }
        }

        // 计算满足条件的组合数量
        long ans = 0;
        for (int i = 1; i < n - 1; i++) {
            ans += leftLt[i] * rightGt[i] + leftGt[i] * rightLt[i];
        }

        System.out.println(ans);
    }
}

Python

def count_teams(n, levels):
    left_gt = [0] * n
    left_lt = [0] * n
    right_gt = [0] * n
    right_lt = [0] * n

    # 计算左右两侧大于和小于当前员工职级的员工数量
    for l in range(n):
        for r in range(l + 1, n):
            if levels[l] < levels[r]:
                left_lt[r] += 1
                right_gt[l] += 1
            else:
                left_gt[r] += 1
                right_lt[l] += 1

    # 计算满足条件的组合数量
    ans = 0
    for i in range(1, n - 1):
        ans += left_lt[i] * right_gt[i] + left_gt[i] * right_lt[i]

    return ans

# 输入处理
n = int(input())
levels = list(map(int, input().split()))

# 计算结果
result = count_teams(n, levels)
print(result)

C++

#include <bits/stdc++.h>
using namespace std;

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

    vector<int> level(n);
    for(int i = 0; i<n;i++) cin >> level[i];
	
    // left_gt[i] 左侧大于 level[i] 的员工个数
    // left_lt[i] 左侧小于 level[i] 的员工个数
    vector<int> left_gt(n, 0), left_lt(n, 0);
    
	// right_gt[i] 右侧大于 level[i] 的员工个数
    // right_lt[i] 右侧小于 level[i] 的员工个数
    vector<int> right_gt(n, 0), right_lt(n, 0);

    for(int l = 0; l < n; l++){
        for(int r = l + 1; r < n; r++){
            if(level[l] < level[r]){
                left_lt[r]++;
                right_gt[l]++;
            }else{
                left_gt[r]++;
                right_lt[l]++;
            }
        }
    }

    long long rs = 0;
    for(int i = 1; i < n - 1; i++){
        rs += left_lt[i] * right_gt[i] + left_gt[i] * right_lt[i];
    }

    cout << rs << endl;
    
	return 0;
}
// 95 %

标签:gt,结队,level,int,OD,lt,++,华为,right
From: https://blog.csdn.net/user_longling/article/details/140981145

相关文章

  • LeetCode144 二叉树的前序遍历
    前言题目:144.二叉树的前序遍历文档:代码随想录——二叉树的递归遍历编程语言:C++解题状态:基础知识不了解思路两种思路,第一是递归。递归算法有三个要素。每次写递归,都按照这三要素来写!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就......
  • ADB安装apk包到所有andriod设备步骤详解
    背景:使用adb工具,用数据线连接电脑与机器,电脑安装apk包后,使用命令直接安装到机器上,省去其他下载等繁琐流程一、电脑安装adb工具1、下载adb压缩包地址:--Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip2、配置环境变量a.右击此电脑......
  • mongodb使用
    一.简介1.1MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com1.2mongodb中有三个重要概念需要掌握数据库(database)数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中可以存放很多集合集合(collection)集合类似于JS中的数组,在集合中......
  • CodeQL安装及使用
    一、关于CodeQL1.CodeQL简介CodeQL是一种将查询语言的概念引入源代码分析的工具,为开发者提供了全新的方式来发现和理解代码中的潜在问题。自2019年GitHub收购Semmle并将CodeQL集成到其平台以来,CodeQL已成为GitHubAdvancedSecurity功能的一部分,通过GitHub的CodeScanning功能,用......
  • NoSQL 数据库之MongoDB
    MongoDB是一个开源的NoSQL数据库,由MongoDBInc.研发和维护。它采用文档存储模型,使用JSON类似的BSON(二进制JSON)格式来存储数据。MongoDB具有高性能、易扩展和高可用性等特点,广泛应用于现代web应用程序中。以下是对MongoDB的详细介绍:核心特性1.文档存储MongoD......
  • 【YashanDB数据库】PHP无法通过ODBC连接到数据库
    【问题分类】驱动使用【关键字】ODBC、驱动使用、PHP【问题描述】应用使用php-fpm+nginx架构,通过php的ODBC拓展连接YashanDB时出现报错:[unixODBC][DriverManager]Can'topenlib'/home/yashandb_odbc/libyas_odbc.so':filenotfound但是在应用所在的主机上使用isql连接Ya......
  • VS Code 未从 launch.json 中获取参数列表
    我有一个正在试验的基本python文件。我想在vscode中使用两个参数启动它。我已从命令窗口(ctrl+shift+p)打开launch.json文件,但每次运行时都无法获取我的参数列表。这是怎么回事?{//UseIntelliSensetolearnaboutpossibleattributes.//Hovertoviewdescripti......
  • UnicodeEncodeError:“ascii”编解码器无法对位置 20 中的字符 u'\xa0' 进行编码:序号
    我在处理从不同网页(在不同站点上)获取的文本中的unicode字符时遇到问题。我正在使用BeautifulSoup。问题是错误并不总是可重现的;它有时适用于某些页面,有时,它会因抛出UnicodeEncodeError而呕吐。我已经尝试了几乎所有我能想到的方法,但我还没有找到任何可以一致工作......
  • Codeforces Round 964 (Div. 4)
    知识点1.对于两个数字,一个乘n,一个除以n,可以理解为n进制下的这个数乘10和除10。比如E题用这个知识点就可以很快的解决问题。题解A.A+BAgain?#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;voidsolve(){ strings; cin>>s; cout<<s[0]-'0'+s[1]-......
  • (leetcode学习)50. Pow(x, n)
    实现 pow(x,n) ,即计算x的整数 n次幂函数(即,xn)。示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2.00000,n=-2输出:0.25000解释:2-2=1/22=1/4=0.25提示:-100.0<x<100.0-231<=n<=231......