编程算法测试题-分糖果

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

原文地址:https://www.cnblogs.com/nightowc/p/4371080.html