pta练习题商品打折问题

img


t")
c=ab0.1和c=a*b/10 有什么区别为什么用/10答案就不对了?

c= a * b/10.0才行,或者c = a * b * 0.1
因为a,b都是整数,10也是整数,那么这里的除法就是两个整数的除法,结果是进行整除,会丢失小数部分,所以不对

PTA 练习题中的商品打折问题是一个经典的数学问题,假设有 $n$ 件商品,每件商品的原价为 $p_i$,现在需要对这些商品进行打折处理,打折后每件商品的价格为原价减去 $d$ 元。如果某件商品的打折后价格小于等于 0 元,则该商品不打折。

假设打折后所有商品的总价为 $sum$,问如何确定 $d$ 才能使 $sum$ 最小?

该问题可以通过贪心算法来求解。首先,对所有商品按原价从小到大进行排序。假设第 $i$ 件商品打折后的价格为 $p_i - d$,则对于前 $i-1$ 件商品,我们希望它们的打折后价格尽可能的小,因为这样能够让后面的商品打折后的价格更大,从而使总价更小。因此,我们可以将前 $i-1$ 件商品的打折后价格设置为原价 $p_j$,其中 $j<i$,即不对它们进行打折。对于第 $i$ 件商品,如果 $p_i - d \leq 0$,则不对它进行打折;否则,将它的打折后价格设置为 $p_i - d$。最后,将所有打折后的商品价格相加,即为所求的 $sum$。

具体实现过程中,我们可以通过一个循环来处理每件商品。在循环中,首先计算出第 $i$ 件商品的打折后价格 $p_i-d$,然后检查这个价格是否小于等于 0,如果是,则不对该商品进行打折;否则,将该商品的打折后价格设置为 $p_i-d$。接着,更新前 $i-1$ 件商品的打折后价格,并计算出所有商品的打折后价格之和。最后,比较所有可能的 $d$ 值,取使 $sum$ 最小的那个 $d$ 值。

下面是一份简单的 Java 代码,可以用于参考:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] p = new int[n];
        for (int i = 0; i < n; i++) {
            p[i] = sc.nextInt();
        }
        Arrays.sort(p);
        int sum = Integer.MAX_VALUE;
        for (int d = 1; d <= p[n - 1]; d++) {
            int[] q = Arrays.copyOf(p, n);
            for (int i = 0; i < n - 1; i++) {
                if (q[i] > d) {
                    q[i] = d;
                }
            }
            int s = Arrays.stream(q).sum();
            if (s < sum) {
                sum = s;
            }
        }
        System.out.println(sum);
    }
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^