51NOD 1246 罐子和硬幣(腦洞大開)

2022-04-08 07:43:06 字數 1011 閱讀 5505

傳送門

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

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

你可以將硬幣分配為: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解題思路:

剛開始我估計大多數人都是想的是平均分配,我也是這麼想的,然後自信寫了一發wa了,/尷尬,然後就想了一下什麼特殊資料,果然,比如說 5 12 12

這個如果是平均分配的話,就是 2 2 2 3 3,那麼最壞情況的最少詢問是15次,但是我們可以這麼分配0 3 3 3 3 ,那麼最少的詢問就是13次了,也就是說我們需要將最少的空位找到,只要是最少的空位,詢問的次數肯定是最少的,知道了這個就可以ac了,要特判一下c <= k/n*n這個的情況。

my code:

#include

#include

using namespace std;

typedef long long ll;

int main()

{ ll n, k, c;

while(cin>>n>>k>>c)

{ll ans = k/n*n;

if(ans >= c)

cout<

51nod 1246 罐子和硬幣

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

51Nod 1246 罐子和硬幣

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

51nod1246 罐子和硬幣

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