校招编程题(一) 石头分堆问题之n个石头分成m堆

摘要
把n个石头分成m堆,要求相邻的两堆石头数量不能相同,求最终的m堆石头中数量大于等于k的有多少堆? 控制台输入两个数,第1个为n,第2个为k 示例: 输入-> 5 1 输出-> 3


import java.util.Scanner;

/************************************
**                                 
**  @Description 将n个石头分成左右数量不同的m堆,求所有堆中数量大于等于k的总共有多个                         
**                                 
**  @author      何明胜                              
**                                
**  @Date 2017-04-07  19:56:08     
**                                
**  @Copyright Copyright (c) 2017  
**                                 
************************************/

public class StoneMToKNum {
    //执行函数
    public static void start(int n, int k){
        int result = 0;//最终结果
        int odd_even = 1;//判断当前堆为从一个堆开始的奇数堆还是偶数堆

        /*
         * 从第一个堆开始,依次分堆。
         * 奇数堆分k个石头,偶数堆分k+1个石头。保证每个堆数量大于等于k
         * 
         * 若当前堆为第奇数个堆,判断当前剩余石头是否大于等于k。若为true,则分K个石头给此堆。将判断变量odd_even赋值为2
         * 若当前堆为第偶数个堆,判断当前剩余石头是否大于等于k+1。若为true,则分K个石头给此堆。将判断变量odd_even赋值为2
         * 否则当前堆数量不够再次分一个堆且次堆石头数量大于k,结束循环。输出结果
         */
        while(true){
            //当前堆为第奇数个堆且当前剩余石头是否大于等于k
            if(1 == odd_even && n >= k){
                result++;
                n -= k;
                odd_even = 2;
            }
            //当前堆为第偶数个堆当前剩余石头是否大于等于k+1
            else if(2 == odd_even && n >= k+1){
                result++;
                n -= k+1;
                odd_even = 1;
            }
            //否则结束
            else{
                break;
            }
        }
        //输出最终结果
        System.out.println(result);
    }

    public static void main(String[] args) {
        //读取n和k的值
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();

        //开始执行
        start(n, k);
    }
}

你可能感兴趣的:(校招编程题)