天天看點

分堆A(京東2017實習生真題)

題目描述

小明得到了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

小明想知道中大于等于的數最多能有多少個?

輸入

輸入兩個數n, k。

樣例輸入

5 1

輸出

輸出最大的得分

樣例輸出

3

時間限制

C/C++語言:1000MS其它語言:3000MS

記憶體限制

C/C++語言:65536KB其它語言:589824KB

Solution

題目給出了分堆規則,推導出最佳的分堆政策。要點是,相鄰的點不同數量的石頭,石頭數大于k才得分,計算最多能得多少分。最佳分堆政策是:k,k+1,k,K+1,是以得分數為n/(2k+1)*2,如果餘數大于等于k,則得分數再加一。

#include<iostream>
using namespace std;
int main(){
    int n,k,res;
    cin>>n>>k;
    res=n/(*k+)*;
    if(n%(*k+)>=k) res++;
    cout<<res<<endl;
}
           
上一篇: 快排源代碼