华为OD机考算法题:MVP争夺战

news/2024/7/20 19:32:37 标签: 华为od, 算法, Java, JavaScript, 数据结构

目录

题目部分

解读与分析

代码实现


题目部分

题目MVP争夺战
难度
题目说明在星球争霸篮球赛对抗赛中,强大的宇宙战队,希望每个人都能拿到MVP。
MVP的条件是,单场最高分得分获得者,可以并列,所以宇宙战队决定在比赛中,尽可能让更多的队员上场,且让所有有得分的队员得分都相同。
然而比赛过程中的每一分钟的得分都只能由某一个人包揽。
输入描述输入第一行为一个数字t,表示有得分的分钟数( 1 <= t <= 50)。
第二行为t个数字,代表每一分钟的得分 p(1 <= p <= 50)。
输出描述输出有得分的队员都是MVP时最少的MVP得分。
补充说明
------------------------------------------------------
示例
示例1
输入9
5 2 1 5 2 1 5 2 1
输出6
说明样例解释:一共4人得分,分别都为6分
5 + 1
5 + 1
5 + 1
2 + 2 + 2


解读与分析

题目解读

题目中给出了 n 个数字,要求把这 n 个数字划分成 m 块,保证 m 块中每块的数字之和相等,即么快的数字之和等于 n / m(注: n/m 取整)。

分析与思路

我能想到最好的办法是动态规划,尝试把 n 个数字放到不同的块中。假设 n 个数中最大的值为 max,那么块的个数的取值范围是 [ 1, n / max ]。

我们采用递归的方式,尝试把某个数字放到一个块中,然后在使用递归尝试剩下的数字。最后成立的条件是每个块的数据总和相等,且所有数据尝试完毕。

此题最后一定会有结果。在最坏的情况下,一个球员包揽了所有的得分,即得分为所有分数之和。

时间复杂度 o(n^{2}),空间复杂度 o(n)。


代码实现

Java代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


/**
 * MVP争夺战
 * 
 * @since 2023.09.11
 * @version 0.1
 * @author Frank
 *
 */
public class MVPCompetition {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String input = sc.nextLine();
			int count = Integer.parseInt( input );
			input = sc.nextLine();
			String[] numbers = input.split( " " );
			processMVPCompetition( numbers );
		}
	}
	
	private static void processMVPCompetition( String numbers[] )
	{
		int sum = 0;
		int maxNum = 0;
		List<Integer> numList = new ArrayList<Integer>();
		for( int i = 0; i < numbers.length; i ++ )
		{
			int tmpNum = Integer.parseInt( numbers[i] );
			if( tmpNum > maxNum )
			{
				maxNum = tmpNum;
			}
			sum += tmpNum;
			numList.add( tmpNum );
		}
		
		int maxMVPCnt = sum / maxNum;
		for( int i = maxMVPCnt; i >= 1; i --)
		{
			if( sum % i != 0 )
			{
				continue;
			}
			int aveScroe = sum / i;
			
			int[] tmpSum = new int[ i ];
			for( int j = 0; j < tmpSum.length; j ++ )
			{
				tmpSum[j] = 0;
			}
			int ret = processAverageScroe( aveScroe, tmpSum, numList );
			if( ret != -1 )
			{
				System.out.println( ret );
				return;
			}
		}
		
	}

	private static int processAverageScroe( int score, int[] tmpSum, List<Integer> numbers)
	{
		int ret = -1;

		int tmpNum = numbers.get( 0 );
		numbers.remove( 0 );
		
		for( int i = 0; i < tmpSum.length; i ++ )
		{
			if( tmpNum + tmpSum[i] > score )
			{
				continue;
			}
			
			tmpSum[i] = tmpSum[i] + tmpNum;
			boolean meet = isArrayAllScore( score, tmpSum, numbers );
			if( meet )
			{
				return score;
			}
			ret = processAverageScroe( score, tmpSum, numbers);
			if( ret != -1 )
			{
				return ret;
			}
			tmpSum[i] = tmpSum[i] - tmpNum;
		}
		
		numbers.add( 0, tmpNum );
		return ret;		
	}
	
	private static boolean isArrayAllScore( int score, int[] tmpSum, List<Integer> numbers )
	{
		boolean ret = true;
		if( numbers.size() > 0 )
		{
			return false;
		}
		for( int i = 0; i < tmpSum.length; i ++ )
		{
			if( tmpSum[i] != score )
			{
				return false;
			}
		}
		return ret;
	}

}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        // count 可以忽略
        var count = parseInt(line);
        line = await readline();
        var numberArr = line.split(" ");
        processMVPCompetition(numberArr);
    }
}();

function processMVPCompetition(numbers) {
    var sum = 0;
    var maxNum = 0;
    var numList = new Array();
    for (var i = 0; i < numbers.length; i++) {
        var tmpNum = parseInt(numbers[i]);
        if (tmpNum > maxNum) {
            maxNum = tmpNum;
        }
        sum += tmpNum;
        numList.push(tmpNum);
    }

    var maxMVPCnt = parseInt( sum / maxNum );
    for (var i = maxMVPCnt; i >= 1; i--) {

        if (sum % i != 0) {
            continue;
        }
        var aveScroe = sum / i;

        var tmpSum = new Array();
        for (var j = 0; j < i; j++) {
            tmpSum[j] = 0;
        }

        var ret = processAverageScroe(aveScroe, tmpSum, numList);
        if (ret != -1) {
            console.log(ret);
            return;
        }
    }

}

function processAverageScroe( score, tmpSum, numbers) {
    var ret = -1;

    var tmpNum = numbers.shift(0);
    for (var i = 0; i < tmpSum.length; i++) {
        if (tmpNum + tmpSum[i] > score) {
            continue;
        }
        tmpSum[i] = tmpSum[i] + tmpNum;
        var meet = isArrayAllScore(score, tmpSum, numbers);
        if (meet) {
            return score;
        }
        ret = processAverageScroe(score, tmpSum, numbers);
        if (ret != -1) {
            return ret;
        }
        tmpSum[i] = tmpSum[i] - tmpNum;
    }

    numbers.unshift( tmpNum );
    return ret;
}

function isArrayAllScore(score, tmpSum, numbers) {
    var ret = true;
    if (numbers.length > 0) {
        return false;
    }
    for (var i = 0; i < tmpSum.length; i++) {
        if (tmpSum[i] != score) {
            return false;
        }
    }
    return ret;
}

(完)


http://www.niftyadmin.cn/n/5022901.html

相关文章

Pytorch 多卡并行(2)—— 使用 torchrun 进行容错处理

前文 Pytorch 多卡并行&#xff08;1&#xff09;—— 原理简介和 DDP 并行实践 介绍了使用 Pytorch 的 DDP 库进行单机多卡训练的方法&#xff0c;本文进一步说明如何用 torchrun 改写前文代码&#xff0c;以提高模型训练的效率和容错性torchrun 是从 Pytorch 1.9.0 开始引入的…

vue3项目运行时解析文件的顺序

在 Vue 3 项目运行时&#xff0c;文件的解析顺序如下&#xff1a; 首先&#xff0c;Vue 3 会解析并执行 main.js 文件。这是整个应用程序的入口文件。通常&#xff0c;在 main.js 中创建 Vue 应用实例&#xff0c;并将根组件挂载到指定的 DOM 元素上。 在 main.js 中&#xff…

CentOS系统环境搭建(二十)——CentOS7安装chat GPT进阶

centos系统环境搭建专栏&#x1f517;点击跳转 CentOS7安装chat GPT进阶 Welcome to the AI era! 基于上一篇文章CentOS系统环境搭建&#xff08;十九&#xff09;——CentOS7安装chat GPT&#xff0c;我们用docker20安装了chatGPT。但&#xff0c;总感觉不够好。 使用dock…

Vue项目中全局变量process的用法解析

一、什么是process process对象是一个全局变量&#xff0c;提供了有关当前Node.js进程的信息并对其进行控制。常用于Vue项目中环境区分&#xff0c;对不同环境的配置不同&#xff0c;例如&#xff1a;根据全局变量区分请求的url地址、是否开始eslint、不同环境的特殊配置等等。…

layui talbe内容自动换行以及固定列自适应换行后的高度

CSS样式&#xff08;必须&#xff09; .layui-table-cell {line-height: 20px !important;vertical-align: middle;height: auto;overflow: visible;text-overflow: inherit;white-space: normal; }固定列自适应换行后的高度 that.tableIns that.http.table({id: dmmoDataLi…

element-ui el-table 滚动到底部,进行加载下一页

使用element-ui 自带的InfiniteScroll 无限滚动组件无法使用在table里面&#xff0c;所以项目只能组件写一个 俺的方法是写了一个自定义组件&#xff0c;进行监听滚动条是否拉到最底部进行一个处理。方法如下 直接复制完事了&#xff0c; loadTableMore: { bind(el, binding…

2023/9/12 -- C++/QT

作业 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xf…

科目二试题

int main() {int i 1;int j 0;while (i < 10) {i;if (i % 2 ! 0) {break;}j;}printf("%d %d\n", i, j);system("pause");return 0; }答案&#xff1a; 3 1int x 3;#define ADD(x,y) x * yint main() {int x 2;int y 3;int res ADD(x, y);printf…