天天看點

京東實習筆試——分堆A

解題思路:題目是分石頭的。抽象出來,将一個數n,分成一個序列,相鄰數字不能相等,求分組中數字大于等于k的最多組數。當兩個數字k和k+1交替出現時,才會出現較多的組數。将k和k+1看做是一個組合,求組合數m=n/(2*k+1)的值,并判斷餘數y=n%(2*k+1)和k的大小,若大于k,則(2m+1)堆,否則為2m個堆。

package 京東;

import java.util.Scanner;

/**
 * 小明得到了n個石頭,他想把這些石頭分成若幹堆,每堆至少有一個石頭。他把這些石堆排在一條直線上,他希望任意相鄰兩堆的石頭數都不一樣。
 * 小明最後的得分為石頭數大于等于k的石堆數,問他最多能得多少分。
 * 嚴格地,小明把n個石頭分成了m堆,每堆個數依次為a1,a2.....,am。
 * 要求滿足: 1、ai≥1(1≤i≤m)     2、ai≠ai+1(1≤i<m)     3、a1+a2+...+am=n 小明想知道中大于等于的數最多能有多少個?
 * 測試案例:
 * 輸入:5  1
 * 輸出:3
 */
public class Q2017_分堆A {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int n = sc.nextInt();
			int k = sc.nextInt();
			
			if(n<k){
				return;
			}
			int dou = 2*k + 1;//将k和k+1作為一組資料
			int num = n/dou;//一共有num組,及2*num個堆
			int mod = n%dou;//取餘後,判斷是否大于k,若大于k則堆數+1
			if(mod>=k){
				num = 2*num + 1;
			}else {
				num = 2*num;
			}
			System.out.println(num);
		}
		sc.close();
	}

}
           

繼續閱讀