zoukankan      html  css  js  c++  java
  • “凯易迅Calix”实习上机——打折问题

    题目要求:

      题目记得不太清楚,大概的意思是一个商店的打折方案如下:设一个客户买了n个商品,价格分别是p1,p2,...,pn

      (1)第一个商品不打折,即cost=p1;

      (2)第i个商品的折扣d=min{p1,p2,...,pi-1}.如果d>pi也就是说打折的前比他付的钱还多,那么这个商品就不要钱了,相当于d=p1;

      例如:n=4,价格分别为{4,9,2,3},这是题目给的示例  

        p1=4,d1=0,cost=4,because,the first item is never discounted;

        p2=9,d2=4,cost=9-4=5.means that the second item only need to pay 5$

        p3=2,d3=min{4,9}=4<p3, so d3=2,cost=2.means that the third item is free

        p4=3,d4=min{4,9,2}=2,d4=2,cost=3-2=1,.means that the fourth item need to pay 1$

      so, the total prices is 10$

        示例截图附在最后了。

    解题思路

      最坏的思路:对于每个价格,求前面的最小值,类似于示例的思路。

      目前最优的思路:仔细思考会发现,对于第i个价格,di=min{min{p1,...,pi-2},pi-1},所以每次求前面价格最小值的时候,可利用之前的计算。

    代码如下:

    1、第一种:复杂性比较高  

    public static void reduceSum(int[] prices){
            int sumReduce=prices[0];
            for (int i = 1; i < prices.length; i++) {
                int minvalue=minValue(prices,i);
                //System.out.println(prices);
                //System.out.println(minvalue);
                if (prices[i]<minvalue) {
                    minvalue=prices[i];
                }
    //            else{
                System.out.println("add:"+(prices[i]-minvalue));
                    sumReduce+=prices[i]-minvalue;
    //            }
            }
            
            System.out.println("qian:"+sumReduce);
        }
        public static int minValue(int[] prices,int point){
            int min=Integer.MAX_VALUE;
            for (int i = 0; i < point; i++) {
                if (prices[i]<min) {
                    min=prices[i];
                }
            }
            System.out.println("min:"+min);
            return min;
        }
    
    public class FirstPra {
        public static void main(String[] args) {
            int[] prices={4,9,2,3};
            //minValue(prices, 3);
            reduceSum(prices);
        }
        public static void reduceSum(int[] prices){
            int sumReduce=prices[0];
            for (int i = 1; i < prices.length; i++) {
                int minvalue=minValue(prices,i);
                //System.out.println(prices);
                //System.out.println(minvalue);
                if (prices[i]<minvalue) {
                    minvalue=prices[i];
                }
    //            else{
                System.out.println("add:"+(prices[i]-minvalue));
                    sumReduce+=prices[i]-minvalue;
    //            }
            }
            
            System.out.println("qian:"+sumReduce);
        }
        public static int minValue(int[] prices,int point){
            int min=Integer.MAX_VALUE;
            for (int i = 0; i < point; i++) {
                if (prices[i]<min) {
                    min=prices[i];
                }
            }
            System.out.println("min:"+min);
            return min;
        }
    }
    View Code

    2、第二种,目前最优的思路”

         int prices={4,9,2,3};
         int sumReduce=prices[0]; int minValue_last=prices[0]; int minValue_cur=0; for (int i = 1; i < prices.length; i++) { minValue_cur=minValue_last<prices[i]?minValue_last:prices[i]; sumReduce+=prices[i]-minValue_cur; minValue_last=minValue_cur; } System.out.println("qian:"+sumReduce);

     

      
  • 相关阅读:
    Selector + 线程池 遇到的问题
    【转】Android TabActivity无法正常bindService解决方法
    Android 中的 Service 全面总结
    【转】IT 圈里有哪些经常被读错的词?
    【转】线程的7种状态及相互转换
    【eoeandroid 特刊】第117期打包网盘下载地址
    使用 Android 自带的 proguard 混淆源码
    Google+ 连接不上的解决办法
    【转】AsyncTask的用法
    winForm简单数据绑定
  • 原文地址:https://www.cnblogs.com/xiangyangzhu/p/6211219.html
Copyright © 2011-2022 走看看