首页 > 试题广场 >

矿泉水问题

[编程题]矿泉水问题
  • 热度指数:2017 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小明横穿沙漠,需要携带至少x毫升的水。

有两种规格的矿泉水可供选购:小瓶矿泉水每瓶500ml,价格a元。大瓶矿泉水每瓶1500ml,价格b元。

小明打算买一些矿泉水用于横穿沙漠,为了保证至少买到x毫升的水,小明至少需要花费多少钱?


输入描述:
第一行一个正整数t(t<=1000),表示有t组测试数据;

接下来t行,每行3个正整数:x,a,b。其中x<=1,000,000,000,表示小明至少需要x毫升水;a<=100,b<=100,分别表示小瓶和大瓶矿泉水的价格,单位:元。


输出描述:
每组测试数据输出一行,表示小明最少需要花费的钱,单位:元。
示例1

输入

3
5000 5 10
4999 5 10
5000 5 100

输出

35
35
50
/*
* 分享一个java的代码
* 思路:
* 1.判断性价比:如果大瓶的价格是小瓶的三倍或更多,那肯定全选小瓶,反之则进入第二步判断
* 2.判断最后一个大瓶是否用1至2个小瓶替代,看看几个小瓶替代的后的总价格是否超过一个大瓶的价格,是则替代,否则替代
* */


import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int swml=500;
        int bwml=1500;
        //a[x][0]为最小ml
        //a[x][1]为小瓶价格
        //a[x][2]为大屏价格
        int tem= in.nextInt();
        int a[][] = new int[tem][3];
        for(int i=0;i<tem;i++){
            for(int j=0;j<3;j++){
                a[i][j]=in.nextInt();
            }
        }
        double b[]=new double[tem];
        for(int i=0;i<tem;i++){
            b[i]=(double)a[i][2]/(double)a[i][1];
            //性价比小于3;小瓶优势
            if(3-b[i]<1e-12){
                int n = 0;
                while (n*swml<a[i][0]){
                    n++;
                }
                System.out.println(n*a[i][1]);
            }
            //大瓶优势
            else {
                int n=0;
                while (n*bwml<a[i][0]){
                    n++;
                }
                //全部都是大瓶的价格
                int n1=n*a[i][2];
                //开始用小瓶替代最后一个大瓶
                int m=0;
                while (((n-1)*bwml+m*swml)<a[i][0]){
                    m++;
            }
                //小瓶替代后的价格
                int n2=(n-1)*a[i][2]+m*a[i][1];
                //判断谁便宜就可以了
                if(n1<n2) System.out.println(n1);
                else System.out.println(n2);
            }
        }
    }
}

发表于 2023-09-20 22:18:33 回复(0)