目录
题目描述
小美的外卖订单
小美正在设计美团外卖的定价信息。已知外卖定价的规则如下:
1. 每道菜有折扣价和原价。折扣价不能超过原价。
2. 订单有满x元减y元的优惠。当购买的菜的价格总和不小于x元时,总价格可以减y元。“减”的价格不能超过“满”的价格。
3. 满减优惠和折扣价是互斥的,当且仅当每个菜都选择了原价才可以触发满减。
4. 系统会自动为客户计算最低价格的方案。
在设计定价时,原价、折扣价和满减的价格都必须是正实数。如果设计的定价发生问题,则会提示数据错误。
请使用等价划分法设计测试用例,来测试该系统的功能。
输入描述:
第一行输入一个正整数n,代表菜的总数。 接下来的n行,每行输入两个实数和,代表每道菜的原价是,折扣价是。 最后一行输入两个实数x和y,代表满x元可以减y元。 数据中所有实数的绝对值不超过1000。
输出描述:
如果数据有误,则输出一行字符串"error"。 否则输出一个小数,小数点后保留2位即可。该小数代表顾客购买了全部菜各一份时,订单的总价格。
示例1
输入例子:
2 10 5.5 10 6.5 15 3输出例子:
12.00例子说明:
虽然触发了满15元减3元,但使用折扣只需要花12元,低于使用满减的价格(20-3=17),因此最终系统会为客户推荐折扣价。
本题需要特别注意
1.数据类型
由于测试的数据可能比较大,所以读取每件菜原价和打折价格应该用double存储
2.注意判断数据是否符合现实
由于本题的数据具有现实意义,所以读取的每个数都应该为正数,因此每次读取都应该判断一下
代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = in.nextInt();
if(n <= 0){
System.out.println("error");
return;
}
double[] a = new double[n];
double[] b = new double[n];
for(int i = 0;i< n;i++){
a[i] = in.nextDouble();
if(a[i] <= 0){
System.out.println("error");
return;
}
b[i] = in.nextDouble();
if(b[i] <= 0){
System.out.println("error");
return;
}
}
for(int i = 0 ;i < n;i++){
if(a[i] < b[i]){
System.out.println("error");
return;
}
}
int x = in.nextInt();
int y = in.nextInt();
if(x < y || x <= 0|| y<=0){
System.out.println("error");
return;
}
//触发满减
double sum1 = 0;
for(int i = 0;i < a.length;i++){
sum1 += a[i];
}
if(sum1 > (double)x){
sum1 = sum1 - (double)y;
}
double sum2 = 0;
for(int i = 0;i<b.length;i++){
sum2 += b[i];
}
// System.out.println(sum1);
// System.out.println(sum2);
double sum = sum1 < sum2?sum1:sum2;
System.out.printf("%.2f",sum);
}
}