世界已冷酷至极, 让我们携手前行。
自助收录

2023年华为OD机考真题:网上商城优惠活动(一)

算法刷题1年前 (2023)更新 江南白衣
509 0 0
2023年华为OD机考真题:网上商城优惠活动(一)

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:网上商城优惠活动(一)
时间限制:1s 空间限制:50MB 限定语言:不限
题目描述:
【背景】
某网上商城举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为:
1.每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推;
2.92折券,1次限使用1张,如100元,则优惠后为92元;
3.无门槛5元优惠券,无使用数限制,直接减5元。
【优惠券使用限制】
每次最多使用2种优惠券,2种优惠可以叠加(优惠叠加时以优惠后的价格计算),以购物200元为例,可以先用92折券优惠到184元,再用1张满减券优惠10元,最终价格是174元,也可以用满减券2张优惠20元为180元,再使用92折券优惠到165(165.6向下取整)元,不同使用顺序的优惠价格不同,以最优惠价格为准。在一次购物中,同一类型优惠券使用多张时必须一次性使用,不能分多次拆开穿插使用(不允许先使用1张满减券,再用打折券,再使用一张满减券)。
【问题】
请设计实现一种解决方法,帮助购物者以最少的优惠券获得最优的优惠价格。优惠后价格越低越好,同等优惠价格,使用的优惠券越少越好,可以允许某次购物不使用优惠券。
【约定】
优惠活动每人只能参加一次,每个人的优惠券种类和数量是一样的。
输入描述:
第一行:每个人拥有的优惠券数量(数量取值范围为[0, 10]),按满减、打折、无门槛的顺序输入。
第二行:表示购物的人数n(1 <= n <= 10000)。
最后n行:每一行表示某个人优惠前的购物总价格(价格取值范围(0, 1000],都为整数)。
约定:输入都是符合题目设定的要求的。
输出描述:
每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总数量,每行的输出顺序和输入的顺序保持一致。
补充说明:
1.优惠券数量都为整数,取值范围为[0, 10]。
2.购物人数为整数,取值范围为[1, 10000]。
3.优惠券的购物总价为整数,取值范围为(0, 1000]。
4.优惠后价格如果是小数,则向下取整,输出都为整数。
示例1
输入:
3 2 5
3
100
200
400
输出:
65 6
155 7
338 4
说明:
【输入说明】
第一行:3种优惠券数量分别为满减券3张,打折券2张,无门槛5张
第二行:总共3个人购物
第三行:第一个人购物优惠前价格为100元
第四行:第二个人购物优惠前价格为200元
第五行:第三个人购物优惠前价格为400元
【输出说明】
输入3个人,输出3行结果,同输入的顺序,对应每个人的优惠结果,如下:
第一行:先使用1张满减券优惠到90元,再使用5张无门槛券优惠25元,最终价格是65元,总共使用6张优惠券
第二行:先使用2张满减券优惠到180元,再使用5张无门槛券优惠25元,最终价格是155元,总共使用7张优惠券
第三行:先使用1张92折券优惠到368元,再使用3张满减券优惠30元,最终价格是338元,总共使用4张优惠券
解题思路:
主要分四种情况:
先满减,再打折
先打折,再满减
先满减,再无门槛
先打折,再无门槛
注:因为无门槛是直接减,所以不能在满减和打折前面。
还需考虑到优惠券是0的情况,因为满减和无门槛都是与张数有关,
所有我们只考虑了有无打折券的情况。

代码实现:

package com.codernav.demo.hwod.exam;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @title 网上商城优惠活动(一)
 * @Description 某网上商城举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为:
 * 1.每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推;
 * 2.92折券,1次限使用1张,如100元,则优惠后为92元;
 * 3.无门槛5元优惠券,无使用数限制,直接减5元。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static int manjian;
    public static int dazhe;
    public static int wumenkan;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        manjian = sc.nextInt();
        dazhe = sc.nextInt();
        wumenkan = sc.nextInt();

        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            double money = sc.nextInt();

            int quanMJ = money / 100 > manjian ? manjian : (int) (money / 100);   //首先使用满减的张数

            // key:活动后的价格,value:使用优惠券的张数
            Map<Double, Integer> map = new HashMap<>();
            double afterDZ = Double.MAX_VALUE;
            double afterMJ = Double.MAX_VALUE;
            double dazheWMK = Double.MAX_VALUE;

            if (dazhe > 0) {  //有打折券的情况
                afterDZ = manJian(money) * 0.92;     //先满减后打折
                map.put(afterDZ, quanMJ + 1);

                afterMJ = manJian(money * 0.92);   //先打折后满减
                int quanMJAfterDZ = (int) (money * 0.92 / 100 > manjian ? manjian : money * 0.92 / 100); //先打折后满减的满减券
                if (map.containsKey(afterMJ)) {
                    map.put(afterMJ, map.get(afterMJ) > quanMJAfterDZ + 1 ? quanMJAfterDZ + 1 : map.get(afterMJ));
                } else {
                    map.put(afterMJ, 1 + quanMJAfterDZ);
                }

                dazheWMK = money * 0.92 - wumenkan * 5;  //先打折后无门槛
                if (map.containsKey(dazheWMK)) {
                    map.put(dazheWMK, map.get(dazheWMK) > wumenkan + 1 ? wumenkan + 1 : map.get(dazheWMK));
                } else {
                    map.put(dazheWMK, 1 + wumenkan);
                }
            }

            double manjianWMK = manJian(money) - wumenkan * 5;  //先满减后无门槛
            if (map.containsKey(manjianWMK)) {
                map.put(manjianWMK, map.get(manjianWMK) > quanMJ + wumenkan ? quanMJ + wumenkan : map.get(manjianWMK));
            } else {
                map.put(manjianWMK, quanMJ + wumenkan);
            }

            double min = Math.min(Math.min(afterDZ, afterMJ), Math.min(manjianWMK, dazheWMK)); //求出最小价格
            System.out.println((int) Math.floor(min) + " " + map.get(min));

        }

    }

    /**
     * 满减后的价格
     *
     * @param money
     * @return
     */
    public static double manJian(double money) {

        if (money / 100 >= manjian) {
            return money - manjian * 10;
        } else {
            return money - (money / 100) * 10;
        }
    }

}
© 版权声明

相关文章

开发者导航新手教程

暂无评论

暂无评论...