51nod1246 罐子和硬幣

2022-08-15 05:33:11 字數 1417 閱讀 8332

有n個罐子,有k個硬幣,每個罐子可以容納任意數量的硬幣。罐子是不透明的,你可以把這k個硬幣任意分配到罐子裡。然後罐子被打亂順序,你從外表無法區別罐子。最後罐子被編上號1-n。每次你可以詢問某個罐子,如果該罐子裡有硬幣,則你可以得到1個(但你不知道該罐子中還有多少硬幣),如果該罐子是空的,你得不到任何硬幣,但會消耗1次詢問的機會。你最終要得到至少c枚硬幣(c <= k),問題是給定n,k,c,由你來選擇一種分配方式,使得在最壞情況下,詢問的次數最少,求這個最少的次數。

例如:有3個罐子,10個硬幣,需要得到7個硬幣,(n = 3, k = 10, c = 7)。

你可以將硬幣分配為:3 3 4,然後對於每個罐子詢問2次,可以得到6個硬幣,再隨便詢問乙個罐子,就可以得到7個硬幣了。

input

輸入3個數:n,k,c (1 <= n <= 10^9, 1 <= c <= k <= 10^9)。
output

輸出最壞情況下所需的最少詢問次數。
input示例

4 2 2
output示例

4

解題思路:因為分配是我們自己決定的,即我們知道幾個罐子有幾個硬幣。

所以分三種情況

1.分的剛剛好(即k%n==0),不管打亂沒打亂我們都知道每個罐子有(k/n)個就直接每個罐子取k/n就行,答案則為c.

2.當k/n*n>=c時答案也是c,為什麼?

即每個罐子我們都可以均分到k/n個,而當k/n*n>=c時,我們只要每個罐子取k/n即可。

3.除上面兩種情況外,我們要讓硬幣數量一樣多的罐子數盡可能多。答案就是c加上抓空的次數。

而有兩種情況使抓空的次數盡可能少:

a.硬幣按k/n分,將罐子中的硬幣分為k/n和k/n+1,硬幣數量為k/n的罐子數為n-k%n,硬幣數量為k/n+1的罐子數為k%n,則抓空的次數y=n-k%n.

(即硬幣為k/n的罐子數)

b.硬幣按k/n+1分,抓空的次數則為n-k/(k/n+1)。

答案就是c+min(n-k%n,n-k/(k/n+1)).

為什麼是這兩種情況,證明我也不知道,

。。。但是可以從一組資料可以看出

n k c

4 9 9

1.如果按k/n=2分,則罐子中硬幣為 2 2 2 3,則答案是9+3=12;

2.而按k/n+1=3分,則罐子中硬幣為 3 3 3 0,則答案為9+1=10;

所以答案不是一定按k/n最小。

哪位大佬知道為什麼是兩種情況的一種可以告知一下嗎?謝謝!!!

**:

#include#include

#include

#include

using

namespace

std;

intmain()

51nod 1246 罐子和硬幣

有n個罐子,有k個硬幣,每個罐子可以容納任意數量的硬幣。罐子是不透明的,你可以把這k個硬幣任意分配到罐子裡。然後罐子被打亂順序,你從外表無法區別罐子。最後罐子被編上號1 n。每次你可以詢問某個罐子,如果該罐子裡有硬幣,則你可以得到1個 但你不知道該罐子中還有多少硬幣 如果該罐子是空的,你得不到任何硬...

51Nod 1246 罐子和硬幣

acm模版 這裡需要強調的是,分配是我們決定的,拿的方案也是我們決定的,所以,這裡預設是我們知道每個罐子可能擁有的硬幣個數。一開始沒有讀懂這層隱藏條件,所以自己想了半天也沒有想通樣例 接著,我們需要考慮的是兩大種情況四小種情況 第一 無抓空情況,結果一定是c次。1 每個罐子的硬幣個數我們都知道 一定...

51nod1246罐子與硬幣

1246 罐子和硬幣 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 有n個罐子,有k個硬幣,每個罐子可以容納任意數量的硬幣。罐子是不透明的,你可以把這k個硬幣任意分配到罐子裡。然後罐子被打亂順序,你從外表無法區別罐子。最後罐子被編上號1 n。每次你可以詢問某個罐...