首页 > 试题广场 >

小美的外卖订单

[编程题]小美的外卖订单
  • 热度指数:5445 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小美正在设计美团外卖的定价信息。已知外卖定价的规则如下:
1. 每道菜有折扣价和原价。折扣价不能超过原价。
2. 订单有满x元减y元的优惠。当购买的菜的价格总和不小于x元时,总价格可以减y元。“减”的价格不能超过“满”的价格。
3. 满减优惠和折扣价是互斥的,当且仅当每个菜都选择了原价才可以触发满减。
4. 系统会自动为客户计算最低价格的方案。

在设计定价时,原价、折扣价和满减的价格都必须是正实数。如果设计的定价发生问题,则会提示数据错误。
请使用等价划分法设计测试用例,来测试该系统的功能。

输入描述:
第一行输入一个正整数n,代表菜的总数。
接下来的n行,每行输入两个实数a_ib_i,代表每道菜的原价是a_i,折扣价是b_i
最后一行输入两个实数xy,代表满x元可以减y元。

1\leq n \leq 10^5
数据中所有实数的绝对值不超过1000。


输出描述:
如果数据有误,则输出一行字符串"error"。
否则输出一个小数,小数点后保留2位即可。该小数代表顾客购买了全部菜各一份时,订单的总价格。
示例1

输入

2
10 5.5
10 6.5
15 3

输出

12.00

说明

虽然触发了满15元减3元,但使用折扣只需要花12元,低于使用满减的价格(20-3=17),因此最终系统会为客户推荐折扣价。
示例2

输入

2
10 5.5
10 6.5
20 10

输出

10.00

说明

触发满20元减10元即可。满减价优于折扣价。
示例3

输入

2
10 10.25
10 3.5
20 4.5

输出

error

说明

折扣价高于原价,数据错误。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 原价,折扣价
        double yuan = 0, zekou = 0;
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        int size = num;
        double [][]arr = new double[num][2];
        while (num * 2 > 0) {
            double a = in.nextDouble();
            double b = in.nextDouble();
            // 输入错误处理
            if (b > a || b <= 0) {
                System.out.println("error");
                return;
            }
            arr[num - 1][0] = a;
            arr[num - 1][1] = b;
            num--;
        }

        // 计算原价和折扣价
        for (int i = 0; i < size; i++) {
            yuan = yuan + arr[i][0];
            zekou = zekou + arr[i][1];
        }

        // 满多少
        double man = in.nextDouble();
        // 减多少
        double jian = in.nextDouble();

        // 判断输入是否正确
        if (man < 0 || jian <= 0 || jian > man) {
            System.out.println("error");
            return;
        }

        if (yuan > man) {
            yuan = yuan - jian;
        }

        System.out.printf("%.2f", yuan > zekou ? zekou : yuan);
    }
}

编辑于 2024-03-09 17:35:24 回复(0)
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        //in.nextLine();
        double oriSum = 0; //原价总和
        double disSum = 0; //折扣价总和
        for (int i = 0; i < n; i++) {
            double ori = in.nextDouble();
            double dis = in.nextDouble();
            //in.nextLine();
            if (ori <= 0 || dis <= 0 || ori < dis) {
                System.out.println("error");
                return;
            }
            oriSum += ori;
            disSum += dis;
        }

        double a = in.nextDouble(); //满
        double b = in.nextDouble(); //减
        if (a <= 0 || b <= 0 || a < b) {
            System.out.println("error");
            return;
        }
        // 每满a 减 b
        //double nOriSum = oriSum - ((oriSum / a) * b);
        //满  a 减 b  不要过度解读题目 , 就只是满a 减一次b而已
        double nOriSum=(oriSum>a?oriSum-b:oriSum);

        //还要记住 printf的用法
        System.out.printf("%.2f", Math.min(nOriSum, disSum));
    }
发表于 2024-03-06 10:46:49 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        double x = 0;  // 原价总数
        double y = 0;  // 折扣总数
        Scanner in = new Scanner(System.in);
        int menuCount = in.nextInt();
        while (menuCount-- >= 1) {
            double a = in.nextDouble();  // 原价
            double b = in.nextDouble();  // 折扣
            if (a < b || a <= 0 || b <= 0) {
                System.out.println("error");
                return;
            }
            x += a;
            y += b;
        }
        double o = in.nextDouble();  // 满多少
        double d = in.nextDouble();  // 减多少
        if (o < d || o <= 0 || d <= 0) {
            System.out.println("error");
            return;
        }
        double t = 0;
        t = x >= o ? x - d : x;
        if (t < y) {
            System.out.printf("%.2f", t);
        } else {
            System.out.printf("%.2f", y);
        }
    }
}

发表于 2023-08-16 18:35:39 回复(6)