2024华为OD机试真题-小朋友来自多少小区-(C++/Java/Python)-C卷D卷-100分

这篇博客分享了2024年华为在线开发者(OD)机试的一道题目,要求根据小朋友报告的同小区人数计算至少来自多少个小区。题目描述、输入输出格式、用例及解题思路均被详细阐述,并提供了C++、Java和Python三种语言的解题代码。
摘要由CSDN通过智能技术生成

2024华为OD机试题库-(A卷+B卷+C卷+D卷)-(JAVA、Python、C++)

2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)

目录

题目描述

输入描述

输出描述

用例1

解题思路

代码

c++

Java 

Python 


题目描述

幼儿园组织活动,老师布置了一个任务:

每个小朋友去了解与自己同一个小区的小朋友还有几个。

我们将这些数量汇总到数组 garden 中。

请根据这些小朋友给出的信息,计算班级小朋友至少来自几个小区?

输入描述

输入:garden[] = {2, 2, 3}

输出描述

输出:7

备注

garden 数组长度最大为 999

每个小区的小朋友数量最多 1000 人,也就是 garden[i] 的范围为 [0, 999]

用例1

输入

2 2 3

输出

7

说明

第一个小朋友反馈有两个小朋友和自己同一小区,即此小区有3个小朋友。

第二个小朋友反馈有两个小朋友和自己同一小区,即此小区有3个小朋友。

这两个小朋友,可能是同一小区的,且此小区的小朋友只有3个人。

第三个小区反馈还有3个小朋友与自己同一小区,则这些小朋友只能是另外一个小区的。这个小区有4个小朋友。

解题思路

该题的输出应该是至少有多少个小朋友,题目描述中让求小朋友来自多少小区描述有误。本题的解题思路是使用贪心算法,令小朋友的数量尽量少。比如,小朋友A和小朋友B都说有两个小朋友和自己同小区,那么就可以假设A和B在同一个小区,使小朋友数目尽可能少。但也不是所有说自己小区有相同数量其他小朋友的人都可以假设在同一小区,比如小朋友ABCD都说自己小区的其他小朋友数目为2,那么这个小区的小朋友数目最多为3,但已经出现了四个小朋友,所以至少来自两个小区。假设n个小朋友说自己小区有x个其他小朋友,那么进行小区合并后,至少小朋友的数目是:ceil(n/(x+1))*(x+1).

代码

c++
#include <bits/stdc++.h>
using namespace std;
int func(vector<int> vec) {
    int res=0;
    map<int,int> dict;
    for(auto v:vec) {
        dict[v]++;
    }
    for(auto d:dict) {
        int cnt=d.second;//有key个小朋友来自相同小区的小区个数
        res+=ceil((float)cnt/(d.first+1))*(d.first+1); //这些小朋友至少来自ceil(cnt/(d.first+1))个小区,每个小区(d.first+1)人
    }
    return res;
}

int main() {
    int tmp;
    vector<int> vec;
    while(cin>>tmp) {
        vec.push_back(tmp);
        if(cin.get()=='\n') break;
    }
    cout<<func(vec)<<endl;
    system("pause");
    return 0;
}
Java 
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
 
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    try {
      int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
      System.out.println(getResult(nums));
    } catch (Exception e) {
      System.out.println("0");
    }
  }
 
  public static int getResult(int[] nums) {
    HashMap<Integer, Integer> cnts = new HashMap<>();
 
    for (int num : nums) {
      cnts.put(num, cnts.getOrDefault(num, 0) + 1);
    }
 
    int ans = 0;
    for (int key : cnts.keySet()) {
      int total = key + 1;
      ans += Math.ceil(cnts.get(key) * 1.0 / total) * total;
    }
 
    return ans;
  }
}
Python 
import math
vec=list(map(int,input().split()))
res=0 #至少有多少小朋友
map={} #存有k个其他小朋友的小区个数,相同其他小朋友个数的小区可以合并
for i in vec:
    if i not in map:
        map[i]=0
    map[i]+=1
for k in map:
    cnt=map[k] #有k+1个小朋友的小区个数
    res+=math.ceil(cnt/(k+1))*(k+1) #小区进行合并,至少的小区个数*每个小区的人数
print(res)

首先,在选择服务中心的最佳位置时,我们需要考虑各种因素,包括人口密度、交通便利性、基础设施和竞争对手等。对于华为OD项目来说,我会推荐选址在人口密度相对较高的城市中心地带。这样可以确保服务中心能够覆盖到更多的用户群体,提高服务的便利性和覆盖面。 其次,交通便利性也是选择最佳位置的重要考量因素。一个位于交通枢纽地带的服务中心可以更容易地接触到周围城市的用户,减少用户的前往成本和时间。同时,也方便快速调度和配送产品,提高服务的效率和时效性。 此外,基础设施的完善也是一个重要的考虑因素。一个服务中心应该有稳定的电力、通讯和网络设施,以保证服务的持续性和稳定性。另外,周边商业设施和生活设施的配套也能吸引更多的顾客和员工,提高服务中心的吸引力和竞争力。 最后,对竞争对手的考虑也至关重要。在选择服务中心的位置时,需要做好竞争对手的地域析,避免选择在竞争对手的聚集地带,同时也要考虑如何在竞争对手密集的区域提供更优质的服务和更吸引人的特色,以获得竞争优势。 综上所述,选择服务中心最佳位置需要全面考虑各种因素,包括人口密度、交通便利性、基础设施和竞争对手,这样才能确保服务中心能够更好地为用户提供服务,同时也能提高企业的竞争力和影响力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024剑指offer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值