编程算法测试题-分糖果

编程算法测试题
给出全班同学的成绩单,按照固定顺序排好,向每位学生发糖果,每人最少一颗糖,保证相邻学生中
分数高的糖果多,分数少的糖果少,求出最优条件下,即发出的总糖果最少时,需要的总糖果数。
例:分数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

 

你可能感兴趣的:(测试题)