zoukankan      html  css  js  c++  java
  • 编程算法测试题-分糖果

    编程算法测试题
    给出全班同学的成绩单,按照固定顺序排好,向每位学生发糖果,每人最少一颗糖,保证相邻学生中
    分数高的糖果多,分数少的糖果少,求出最优条件下,即发出的总糖果最少时,需要的总糖果数。
    例:分数90,88,85,87,83,80;则糖果分3,2,1,3,2,1=12

    自己写的没考虑复杂度问题,虽然比较low,但先记下来吧

    package test;
    import java.util.Scanner;
    public class Math1 {
        static int number=20;
        public static void main(String[] args) {        
            System.out.print("请输入全部学生成绩,以逗号分隔: ");
            Scanner a = new Scanner(System.in);
            String str[]=a.next().split("\D+");
            int grade[]=new int[number];//学生成绩数组
            //输出全部学生成绩
            System.out.print("每个人的成绩为: ");
            for(int i=0;i<str.length;i++)
            {
                grade[i]=Integer.parseInt(str[i]);
                System.out.print(grade[i]+" ");
            }
            System.out.println("");
            //调用分配糖果函数,得到每个人的糖果数,并输出
            int candy[]=deliverCandy(grade);
            int sum=0;//总糖果数
            System.out.print("每个人的糖果数: ");
            for(int i=0;i<candy.length;i++)
            {
                System.out.print(candy[i]+" ");
                sum+=candy[i];
            }
            System.out.println("");
            System.out.println("需要的总糖果数为: "+sum);
        }
        //分糖果函数
        public static int[] deliverCandy(int grade[])
        {
            int candy[]=new int[number];
    //--------------------------------1.直接赋成绩值---------------------------//
            for(int i=0;i<number;i++)
            {
                candy[i]=grade[i];
            }
            if(candy[0]>candy[1]) { candy[0]=100;  }//首位值设定:大于旁边值则100,小于则1
            else{candy[0]=1;}
            if(candy[number-1]>candy[number-2]) { candy[number-1]=100;  }
            else{candy[number-1]=1;}
    //--------------------------------2.顺序循环------------------------------//
            for(int i=1;i<number-1;i++) 
            {
                if(candy[i]<candy[i-1] && candy[i]<candy[i+1])//波谷
                {
                    candy[i]=1;
                }
                else if(candy[i]>candy[i-1] && candy[i]>candy[i+1])//波峰
                {
                    candy[i]=100;
                }
                else
                {
                    candy[i]=min(candy[i-1],candy[i+1])+1;
                }
                System.out.print(candy[i]+" ");
            }System.out.println("");
    //--------------------------------3.逆序循环------------------------------//
            for(int i=number-2;i>0;i--)
            {
                if(candy[i]<candy[i-1] && candy[i]<candy[i+1])//波谷
                {
                    candy[i]=1;
                }
                else if(candy[i]>candy[i-1] && candy[i]>candy[i+1])//波峰
                {
                    candy[i]=100;
                }
                else
                {
                    candy[i]=min(candy[i-1],candy[i+1])+1;
                }
                System.out.print(candy[i]+" ");
            }System.out.println("");
    //----------------------------4.将100替换为max+1 ----------------------------//
            for(int i=1;i<number-1;i++)
            {
                if(candy[i]==100){
                    candy[i]=max(candy[i-1],candy[i+1])+1;
                }    
            }
            if(candy[0]==100) { candy[0]=candy[1]+1;  }
            if(candy[number-1]==100) { candy[number-1]=candy[number-1]+1;  }
            return candy;
        }
        //求左右的最小值
        static int min(int a,int b)
        {
            int c;
            if(a>b){c=b;}
            else{c=a;}
            return c;
        }
        //求左右的最大值
        static int max(int a,int b)
        {
            int c;
            if(a<b){c=b;}
            else{c=a;}
            return c;
        }
    }

    【例】输入数据为:99.95.87.75.88.83.84.85.89.78.68.78.98.76.65.75.80.75.86.76

    打印输出:

    请输入全部学生成绩,以逗号分隔: 99.95.87.75.88.83.84.85.89.78.68.78.98.76.65.75.80.75.86.76
    每个人的成绩为: 99 95 87 75 88 83 84 85 89 78 68 78 98 76 65 75 80 75 86 76
    88 76 1 100 1 2 3 100 69 1 2 100 66 1 2 100 1 100
    100 1 100 2 1 2 100 2 1 2 100 3 2 1 100 1 2 3
    每个人的糖果数: 4 3 2 1 2 1 2 3 4 2 1 2 3 2 1 2 3 1 2 1
    需要的总糖果数为: 42

  • 相关阅读:
    019. Remove Nth Node From End of List
    021.Merge Two Sorted Lists
    自定义starter
    servlet里面转发与重定向
    贪婪模式与非贪婪模式
    localstack 线程隔离
    Algorithm & Data structure
    some interview question
    阿里-菜鸟国际-出口大团队招新啦
    JDK8漫谈——集合更强大
  • 原文地址:https://www.cnblogs.com/nightowc/p/4371080.html
Copyright © 2011-2022 走看看