华为OD机试 - 人气最高的店铺(C++题解)

这篇博客详细介绍了如何解决华为OD统一考试B卷中的一道C++题目,即计算1号店铺为了成为人气最高店铺需要发放的最少补贴金额。通过递归和回溯法,解析了处理输入、初始化数据结构、计算最小补贴金额的步骤,给出了完整的C++代码示例,并附带多个测试用例。
摘要由CSDN通过智能技术生成

题目描述

某购物城有m个商铺,现决定举办一场活动选出人气最高店铺。

活动共有n位市民参与,每位市民只能投一票,但1号店铺如果给该市民发放 q 元的购物补贴,该市民会改为投1号店铺。

请计算1号店铺需要最少发放多少元购物补贴才能成为人气最高店铺(即获得的票数要大于其他店铺),如果1号店铺本身就是票数最高店铺,返回0。

输入描述

第一行为小写逗号分割的两个整数n,m,其中:

  • 第一个整数n表示参与的市民总数
  • 第二个整数m代表店铺总数
  • 1 ≤ n,m ≤ 3000

第2到n+1行,每行为小写逗号分割的两个整数p,q,表示市民的意向投票情况,其中每行的:

  • 第一个整数p表示该市民意向投票给p号店铺
  • 第二个整数q表示其改投1号店铺所需给予的q元购物补贴
  • 1 ≤ p ≤ m
  • 1 ≤ g ≤ 10^9

不考虑输入的格式问题

输出描述

1号店铺需要最少发放购物补贴金额

用例1

输入

5,5
2,10
3,20
4,30
5,40
5,90

输出

50

说明
有5个人参与,共5个店铺。
如果选择发放 10元+20元+30元=60元 的补贴来抢2,3.4号店铺的票,总共发放了60元补贴(5号店铺有2票,1号店铺要3票才能胜出)

如果选择发放 10元+40元=50元 的补贴来抢2,5号店铺的票,总共发放了50元补贴(抢了5号店铺的票后,现在1号店铺只要2票就能胜出)

所以最少发放50元补贴

用例2

输入

5,5
2,10
3,20
4,30
5,80
5,90

输出

60

说明
有5个人参与,共5个店铺。

如果选择发放 10元+20元+30元=60元 的补贴来抢2,3,4号店铺的票,总共发放了60元补贴(5号店铺有2票,1号店铺要3票才能胜出)

如果选择发放 10元+80元=90元 的补贴来抢2,5号店铺的票,总共发放了90元补贴(抢了5号店铺的票后,现在1号店铺只要2票就能胜出)

所以最少发放60元补贴

题目解析

上面的 Java 代码和转换后的 Node.js 代码是为了解决一个问题:给定一组市民对商店的投票信息,计算使得1号商店成为票数最高商店所需的最小补贴金额。下面是详细的解题思路和解题方法:

  1. 输入处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值