題目部分
題目 | 分獎金 |
難度 | 難 |
題目說明 | 公司老板做了一筆大生意,想要給每位員工分配一些獎金,想通過游戲的方式來決定每個人分多少錢。按照員工的工號順序,每個人隨機抽取一個數(shù)字。按照工號的順序往后排列,遇到第一個數(shù)字比自己數(shù)字大的,那么,前面的員工就可以獲得 距離 * 數(shù)字差值 的獎金。如果遇不到比自己數(shù)字大的,就給自己分配隨機數(shù)數(shù)量的獎金。例如,按照工號順序的隨機數(shù)字是:2,10,3。那么第 2 個員工的數(shù)字 10 比第 1 個員工的數(shù)字 2 大,所以,第 1 個員工可以獲得 1 * (10 - 2) = 8。第 2 個員工后面沒有比他數(shù)字更大的員工,所以,他獲得他分配的隨機數(shù)數(shù)量的獎金,就是 10。第 3 個員工是最后一個員工,后面也沒有比他更大數(shù)字的員工,所以他得到的獎金是 3。 請幫老板計算一下每位員工最終分到的獎金都是多少錢。 |
輸入描述 | 第一行 n 表示員工數(shù)量(包含最后一個老板)。 第二是每位員工分配的隨機數(shù)字。 例如: 3 2 10 3 |
輸出描述 | 最終每位員工分到的獎金數(shù)量。 例如: 8 10 3 |
補充說明 | 隨機數(shù)字不重復(fù),員工數(shù)量(包含老板)范圍 1 ~ 10000,隨機數(shù)范圍 1 ~ 100000。 |
------------------------------------------------------ | |
示例 | |
示例1 | |
輸入 | 3 2 10 3 |
輸出 | 8 10 3 |
說明 | 無 |
解讀與分析
題目解讀:
分獎金時,員工先按照員工號排序。每位員工的獎金數(shù)與工號更大的員工抽取的數(shù)字相關(guān),與工號小的員工沒有關(guān)系。
此題可翻譯成:有一個整形數(shù)組,設(shè)為 arr,其長度為 n,數(shù)組個元素已經(jīng)初始化為指定的值。對于數(shù)組中第 i (0?≤ i < n)個元素,如果:
1.?在第 ( i + 1 ) 到 n 個元素中存在比 arr[i] 大的元素,如果這樣的元素有多個,取其下標(biāo)最小的一個元素。假設(shè)下標(biāo)最小的元素其下標(biāo)為 j,那么 arr[i]?的值修改為 ( arr[j] - arr[i]?) * ( j - i)。
2.?在第 ( i + 1 ) 到 n 個元素中不存在比 arr[i] 大的元素,那么 arr[i] 的值保持不變。
遍歷完數(shù)組 arr 之后,輸出數(shù)組 arr 的內(nèi)容。
分析與思路:
雖然此題的難度為“難”,解題思路和算法卻都非常簡單。
我們可以直接從第 0 個元素開始往后遍歷,根據(jù)題目解讀中提到的兩種情況,逐一刷新每個元素的值。因為每個元素的最終值只與排在它后面的元素有關(guān),所以一定要從第?0 個元素開始遍歷,而不能從最后一個元素 (n - 1) 開始遍歷。
在遍歷過程中,最壞的情況需遍歷 n! 次元素,此算法的時間復(fù)雜度 O(n!);整個遍歷過程只使用了原始數(shù)據(jù)類型變量,且空間與數(shù)組長度無關(guān),此算法的空間復(fù)雜度為 O(1)。
代碼實現(xiàn)
Java代碼
import java.util.Scanner;
/**
* 分獎金
* @since 2023.09.11
* @version 0.1
* @author Frank
*
*/
public class BonusDistribution {
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( " " );
// 此處 count == numbers.count,可以完全不用考慮 count.
processBonusDistribution( numbers );
}
}
private static void processBonusDistribution( String numbers[] )
{
int[] arr = arrString2Int( numbers );
for( int i = 0; i < arr.length; i ++ )
{
for( int j = i + 1; j < arr.length; j ++ )
{
if( arr[j] > arr[i] )
{
arr[i] = ( arr[j] - arr[i] ) * ( j - i );
break;
}
}
}
StringBuffer sb = new StringBuffer();
for( int i = 0; i < arr.length; i ++ )
{
if( i != arr.length - 1 )
{
sb.append( arr[i] + " " );
}else
{
sb.append( arr[i] );
}
}
System.out.println( sb.toString() );
}
private static int[] arrString2Int( String numbers[] )
{
int ret[] = new int[numbers.length];
for( int i = 0; i < numbers.length; i ++ )
{
ret[i] = Integer.parseInt( numbers[i] );
}
return ret;
}
}
JavaScript代碼文章來源:http://www.zghlxwxcb.cn/news/detail-707555.html
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(" ");
processBonusDistribution(numberArr);
}
}();
function processBonusDistribution(numberArr) {
var arr = arrString2Int( numberArr );
for( var i = 0; i < arr.length; i ++ )
{
for( var j = i + 1; j < arr.length; j ++ )
{
if( arr[j] > arr[i] )
{
arr[i] = ( arr[j] - arr[i] ) * ( j - i );
break;
}
}
}
console.log( arr.join(" "));
}
function arrString2Int( numberArr )
{
var ret = [];
for( var i = 0; i < numberArr.length; i ++)
{
ret.push( parseInt( numberArr[i] ) );
}
return ret;
}
(完)文章來源地址http://www.zghlxwxcb.cn/news/detail-707555.html
到了這里,關(guān)于華為OD機考算法題:分獎金的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!