C#森林中的兔子(力扣题目)

news2025/4/25 17:22:17

C#森林中的兔子(力扣题目)

题目介绍

森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。

给你数组 answers ,返回森林中兔子的最少数量。

示例 1:

输入:answers = [1,1,2]
输出:5
解释:
两只回答了 “1” 的兔子可能有相同的颜色,设为红色。
之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 “2” 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。
示例 2:

输入:answers = [10,10,10]
输出:11

提示:

1 <= answers.length <= 1000
0 <= answers[i] < 1000

解题思路

假设一只兔子的回答是x,那么说明和它颜色相同的兔子还有x只。那么总共有x+1只同色的兔子(包括自己)。例如,回答1的话,同色共有2只;回答0的话,只有自己。

但问题在于,不同的兔子可能有相同的颜色,或者不同的颜色。我们需要将这些回答分组,使得每个分组满足条件,同时总兔子数量最少。

那如何将这些回答进行分组呢?比如,如果有多个兔子回答同一个数值,如何确定它们是否属于同一颜色组?

比如,假设两个兔子都回答1。那么可能属于同一颜色组。因为该颜色组共有2只,所以这两个的回答都正确。这时候只需要计算2只。如果有第三个回答1的兔子,那么必须分成两个组。比如前两个是一组,第三个属于另一组,这时候另一组至少需要2只(因为第三只回答1,意味着还有一只没被询问到)。所以这时候总共有2 + 2 =4只。

所以,对于相同数值的回答,我们需要将它们分组,每组的大小是该数值加1。然后将这些组的总和相加,得到总的数量。

那具体来说,假设某个数值为x的出现次数是n次。那么每个这样的组最多可以包含x+1只兔子。如果有n个这样的回答,那么需要的组数是ceil(n/(x+1))。每个组贡献x+1只兔子。所以总共有ceil(n/(x+1)) * (x+1)只。

例如,对于示例1中的回答1出现两次。x=1,所以每个组最多允许2只。出现两次的话,刚好可以组成一个组,贡献2只。另一个回答是2,x=2,每个组需要3只。这里出现一次,所以只能组成一个组,贡献3只。所以总共有2+3=5只。

解决方式

使用字典统计回答次数

这种方式利用字典来统计每个回答出现的次数,然后根据每个回答计算所需的最少兔子数量。

using System;
using System.Collections.Generic;

public class Solution {
    public int NumRabbits(int[] answers) {
        Dictionary<int, int> countDict = new Dictionary<int, int>();
        foreach (int ans in answers) {
            if (countDict.ContainsKey(ans)) {
                countDict[ans]++;
            } else {
                countDict[ans] = 1;
            }
        }
        
        int total = 0;
        foreach (var pair in countDict) {
            int x = pair.Key;
            int count = pair.Value;
            int groupSize = x + 1;
            int groups = (count + groupSize - 1) / groupSize;
            total += groups * groupSize;
        }
        
        return total;
    }
}
使用数组统计回答次数

由于题目中取值范围是0到999,我们可以使用固定大小的数组来统计每个回答的出现次数,这种方法在数据范围已知的情况下更为高效。

public class Solution {
    public int NumRabbits(int[] answers) {
        int[] counts = new int[1000];
        foreach (int ans in answers) {
            counts[ans]++;
        }
        
        int total = 0;
        for (int x = 0; x < 1000; x++) {
            int count = counts[x];
            if (count == 0) continue;
            
            int groupSize = x + 1;
            int groups = (count + groupSize - 1) / groupSize;
            total += groups * groupSize;
        }
        
        return total;
    }
}

结合以上字典和数组

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 森林的兔子
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Solution counter = new Solution();
            bool exit = false;

            while (!exit)
            {
                Console.WriteLine("请输入兔子的回答(逗号分隔,例如 1,1,2),输入 'exit' 退出:");
                string input = Console.ReadLine();

                if (input.ToLower() == "exit")
                {
                    exit = true;
                    continue;
                }

                try
                {
                    // 解析输入为整数数组
                    int[] answers = ParseInput(input);

                    // 计算结果
                    int resultDict = counter.CalculateWithDictionary(answers);
                    int resultArray = counter.NumRabbits(answers);

                    // 输出
                    Console.WriteLine($"\n输入数据: [{string.Join(",", answers)}]");
                    Console.WriteLine($"字典方法结果: {resultDict}");
                    Console.WriteLine($"数组方法结果: {resultArray}");
                    Console.WriteLine($"结果是否一致: {resultDict == resultArray}\n");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"错误: {ex.Message}\n");
                }
            }
        }

        // 将输入字符串解析为整数数组
        static int[] ParseInput(string input)
        {
            if (string.IsNullOrWhiteSpace(input))
                throw new ArgumentException("输入不能为空!");

            string[] parts = input.Split(',');
            int[] answers = new int[parts.Length];

            for (int i = 0; i < parts.Length; i++)
            {
                if (!int.TryParse(parts[i].Trim(), out int num) || num < 0)
                    throw new ArgumentException($"无效输入: '{parts[i]}',请输入非负整数。");
                answers[i] = num;
            }

            return answers;
        }
    }
    public class Solution
    {
        public int NumRabbits(int[] answers)
        {
            int[] counts = new int[1000];
            foreach (int ans in answers)
            {
                counts[ans]++;
            }

            int total = 0;
            for (int x = 0; x < 1000; x++)
            {
                int count = counts[x];
                if (count == 0) continue;

                int groupSize = x + 1;
                int groups = (count + groupSize - 1) / groupSize;
                total += groups * groupSize;
            }

            return total;
        }

        public int CalculateWithDictionary(int[] answers)
        {
            Dictionary<int, int> countDict = new Dictionary<int, int>();
            foreach (int ans in answers)
            {
                if (countDict.ContainsKey(ans))
                {
                    countDict[ans]++;
                }
                else
                {
                    countDict[ans] = 1;
                }
            }

            int total = 0;
            foreach (var pair in countDict)
            {
                int x = pair.Key;
                int count = pair.Value;
                int groupSize = x + 1;
                int groups = (count + groupSize - 1) / groupSize; // 向上取整计算组数
                total += groups * groupSize;
            }
            return total;
        }


    }
}

解题思路总结

  1. 统计回答次数:统计每个回答数值出现的次数。
  2. 计算每组数量:对于每个回答数值x,确定每组最多可容纳的兔子数量为x+1。然后根据该组容量将回答次数分成若干组,确保每组中的兔子数量不超过x+1。
  3. 累加总数:每组数量乘以组容量,累加得到所有颜色组的总数,即为森林中兔子的最少数量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于多用户商城系统的行业资源整合模式与商业价值探究

随着电子商务的蓬勃发展&#xff0c;传统的单一商家电商模式逐渐显现出一定的局限性。为了解决商家成本过高、市场竞争激烈等问题&#xff0c;多用户商城系统应运而生&#xff0c;成为一种新型的电商平台模式。通过整合行业资源&#xff0c;这种模式不仅极大地提升了平台和商家…

Three.js + React 实战系列 : 从零搭建 3D 个人主页

可能你对tailiwindcss毫不了解&#xff0c;别紧张&#xff0c;记住我们只是在学习&#xff0c;学习的是作者的思想和技巧&#xff0c;并不是某一行代码。 在之前的几篇文章中&#xff0c;我们已经熟悉了 Three.js 的基本用法&#xff0c;并通过 react-three-fiber 快速构建了一…

如何用大模型技术重塑物流供应链

摘要 在数字化转型加速的背景下&#xff0c;大模型技术凭借其强大的数据分析、逻辑推理和决策优化能力&#xff0c;正成为物流供应链领域的核心驱动力。本文深入探讨大模型如何通过需求预测、智能调度、供应链协同、风险管控等关键环节&#xff0c;推动物流行业从 "经验驱…

【银河麒麟高级服务器操作系统】磁盘只读问题分析

系统环境及配置 系统环境 物理机/虚拟机/云/容器 虚拟机 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 KVM Virtual Machine 处理器 Kunpeng-920 内存 32 GiB 整机类型/架构 arm64 固件版本 EFI Development Kit II / OVMF 软件环境 具体操作系统版…

机器视觉的智能手机屏贴合应用

在智能手机制造领域&#xff0c;屏幕贴合工艺堪称"微米级的指尖芭蕾"。作为影响触控灵敏度、显示效果和产品可靠性的关键工序&#xff0c;屏幕贴合精度直接决定了用户体验。传统人工对位方式已无法满足全面屏时代对极窄边框和超高屏占比的严苛要求&#xff0c;而Mast…

AIM Robotics电动胶枪:智能分配,让机器人点胶涂胶精准无误

在现代工业自动化和智能制造领域&#xff0c;精确的液体分配技术正成为提升生产效率和产品质量的重要因素。AIM Robotics作为这一领域的创新者&#xff0c;提供了多种高效、灵活的点胶涂胶分配解决方案。本文将带您了解AIM Robotics的核心技术、产品系列以及在各行业的成功应用…

负环-P3385-P2136

通过选择标签&#xff0c;洛谷刷一个类型的题目还是很方便的 模版题P3385 P3385 【模板】负环 - 洛谷 Tint(input())def bellman(n,edges,sta):INFfloat(inf)d[INF]*(n1)d[sta]0for i in range(n-1):for u,v,w in edges:ncostd[u]wif ncost<d[v]:d[v]ncostfor u,v,w in e…

抖音的逆向工程获取弹幕(websocket和protobuf解析)

目录 声明前言第一节 获取room_id和ttwid值第二节 signture值逆向python 实现signature第三节 Websocket实现长链接请求protubuf反序列化pushFrame反序列化Response解压和反序列化消息体Message解析应答ack参考博客声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的…

WPF 图片文本按钮 自定义按钮

效果 上面图片,下面文本 样式 <!-- 图片文本按钮样式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

Diffusion inversion后的latent code与标准的高斯随机噪音不一样

可视化latents_list如下; 可视化最后一步与标准的噪声&#xff1a; 能隐约看出到最后一步还是会有“马”的形状 整个代码&#xff08;及可视化代码如下&#xff09;&#xff1a; ## 参考freeprompt(FPE)的代码 import os import torch import torch.nn as nn import torch.n…

江湖密码术:Rust中的 bcrypt 加密秘籍

前言 江湖险恶,黑客如雨,昔日密码“123456”早被各路大侠怒斥为“纸糊轻功”。若还执迷不悟,用明文密码闯荡江湖,无异于身披藏宝图在集市上狂奔,目标大到闪瞎黑客双眼。 为护你安然度过每一场数据风波,特献上一门绝学《Rust加密神功》。核心招式正是传说中的 bcrypt 密…

Milvus(3):数据库、Collections说明

1 数据库 Milvus 在集合之上引入了数据库层&#xff0c;为管理和组织数据提供了更有效的方式&#xff0c;同时支持多租户。 1.1 什么是数据库 在 Milvus 中&#xff0c;数据库是组织和管理数据的逻辑单元。为了提高数据安全性并实现多租户&#xff0c;你可以创建多个数据库&am…

【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择

目录 1 Hive数据模型全景图 2 Hive存储架构解析 3 存储格式对比矩阵 4 存储格式选择决策树 5 ORC文件结构剖析 6 Parquet与ORC技术对比 7 最佳实践指南 7.1 建表示例模板 7.2 性能优化 8 总结 1 Hive数据模型全景图 模型核心组件解析&#xff1a; Database&#xff1…

2025能源网络安全大赛CTF --- Crypto wp

文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章&#xff01;&#xff01;&#xff01; simpleSignin 题目&#xff1a; from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

Godot开发2D冒险游戏——第二节:主角光环整起来!

变量的作用域 全局变量&#xff0c;局部变量&#xff0c;导出变量&#xff08;可以在检查器当中快速查看&#xff09; 为玩家添加移动动画 现在游戏的玩家还只是在滑行&#xff0c;我们需要再添加玩家每个方向上的移动效果 删除原先的Item节点&#xff0c;创建一个动画精灵…

.NETCore部署流程

资料下载&#xff1a;https://download.csdn.net/download/ly1h1/90684992 1.下载托管包托管捆绑包 | Microsoft Learn&#xff0c;下载后点击安装即可。 2.安装IIS 3.打开VS2022&#xff0c;新建项目&#xff0c;选择ASP.NET Core Web API 5.Program修改启动项&#xff0c;取…

数据结构——二叉树,堆

目录 1.树 1.1树的概念 1.2树的结构 2.二叉树 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 2.4.1顺序结构 2.4.2链式结构 3.堆 3.1堆的概念 3.2堆的分类 3.3堆的实现 3.3.1初始化 3.3.2堆的构建 3.3.3堆的销毁 3.3.4堆的插入 3.3.5…

龙虎榜——20250424

指数依然是震荡走势&#xff0c;接下来两天调整的概率较大 2025年4月24日龙虎榜行业方向分析 一、核心主线方向 化工&#xff08;新能源材料产能集中&#xff09; • 代表标的&#xff1a;红宝丽&#xff08;环氧丙烷/锂电材料&#xff09;、中欣氟材&#xff08;氟化工&…

CentOS 7 安装教程

准备&#xff1a; 软件&#xff1a;VMware Workstation 镜像文件&#xff1a;CentOS-7-x86_64-bin-DVD1.iso &#xff08;附&#xff1a;教程较为详细&#xff0c;注释较多&#xff0c;故将操作的选项进行了加粗字体显示。&#xff09; 1、文件–新建虚拟机–自定义 2、硬盘…

Python+AI提示词出租车出行轨迹预测:梯度提升GBR、KNN、LR回归、随机森林融合及贝叶斯概率异常检测研究

原文链接&#xff1a;tecdat.cn/?p41693 在当今数字化浪潮席卷全球的时代&#xff0c;城市交通领域的海量数据如同蕴藏着无限价值的宝藏等待挖掘。作为数据科学家&#xff0c;我们肩负着从复杂数据中提取关键信息、构建有效模型以助力决策的使命&#xff08;点击文末“阅读原文…