华为OD真题-- 短信优惠-带答案

/**

  • 题目描述:
  • 某云短信厂商,为庆祝国庆,推出充值优惠活动。
  • 现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。
  • 输入描述:
  • 第一行客户预算M,其中 0<=M<=1000000
  • 第二行给出售价表,P1,P2...Pn, 其中 1<=n<=100,Pi为充值i元获得的短信条数。1<=Pi<=1000, 1<=n<=100
  • 输出描述:
  • 最多获得的短信条数
  • 补充说明:
  • 收起
  • 示例1
  • 输入:
  • 6
  • 10 20 30 40 60
  • 输出:
  • 70
  • 说明:
  • 分两次充值最优,1元、5元各充一次。总条数 10+60=70
  • 示例2
  • 输入:
  • 15
  • 10 20 30 40 60 60 70 80 90 150
  • 输出:
  • 210
  • 说明:
  • 分两次充值最优,10元、5元各充一次。总条数 150+60=210

*/

public class MessageDiscounts {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int money = Integer.parseInt(sc.nextLine());
        //性价比
        int[] messageCount = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer ::parseInt).toArray();
        ValueIndex [] valueIndices = new ValueIndex[messageCount.length + 1];
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        //下标从1开始,表示价值
        for (int i = 1; i <= messageCount.length; i++){
            valueIndices[i] = new ValueIndex(i,(double)messageCount[i-1]/i);
            hashMap.put(i,messageCount[i-1]);
        }
        //截取下标从1开始的数组
        valueIndices = Arrays.copyOfRange(valueIndices,1,valueIndices.length);
        //按性价比排序
        Arrays.sort(valueIndices,Comparator.comparingDouble((ValueIndex o1) -> o1.value).reversed());
        //选出最合适的方案
        int allCount = 0;
        for (int j = 0; j < messageCount.length; j++){
            if (money == 0){
                break;
            }
            if (money >= valueIndices[j].index){
                money = money - valueIndices[j].index;
                allCount = allCount + hashMap.get(valueIndices[j].index);
            }
        }
        System.out.println(allCount);
    }

   static class  ValueIndex{
        int index;
        double value;

        public  ValueIndex(int index, double value) {
            this.index = index;
            this.value = value;
        }
   }
}

华为OD机试-2023真题主要考察了以下几个方面的知识点: 1. 数据结构与算法:题目涉及了常见的数据结构和算法,如数组、链表、树、图、排序、搜索等。要求考生熟悉这些数据结构的基本操作和常用算法的实现方法。 2. 编程语言:题目要求使用C++或Java语言完成编程任务,要求考生熟悉相应语言的语法和常用的库函数使用方法。 3. 网络通信:题目涉及了网络通信相关的知识点,如TCP/IP协议、HTTP协议、socket编程等。要求考生了解网络通信的基本概念和实现方式。 4. 操作系统:题目要求考生熟悉操作系统相关的知识,如进程管理、内存管理、文件系统等。要求考生了解操作系统的基本功能和实现原理。 5. 数据库:题目涉及了数据库相关的知识点,如SQL语句的编写、数据库的设计和优化等。要求考生具备数据库的基本操作和设计能力。 6. 设计模式:题目要求考生能够根据给定的需求设计相应的对象和类,并且符合设计模式的原则。要求考生熟悉常见的设计模式和其应用场景。 7. 系统设计与架构:题目要求考生从整体上设计和实现一个系统,并考虑系统的性能、可扩展性等因素。要求考生了解系统设计的基本原则和方法。 以上是华为OD机试-2023真题的一些考点分类。考生在复习备考时,可以根据这些考点有针对性地进行学习和练习,提升自己的应试能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

半生程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值