1246 罐子和硬幣
基準時間限制:1 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題
有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 2output示例
4本以為是平均分突然發現平均分有些資料不行//45 64 54 67 錯誤**示例:=.=
#include#include#include#define maxn 1000000005
#define ll long long
using namespace std;
int main()
else
k-=q*n;
w+=q*n;
sum+=q*n;}}
cout就想肯定是分情況的,一種是能平鋪玩的,還有一種是能找到盡量小的0,使得剩下的能全部平鋪,這樣結果就是 空罐子個數加上所詢問的硬幣個數,而最小的空罐子個數就是 用總的硬幣數/(最少平均放的到最少罐子的個數+1)
#include#include#include#define maxn 1000000005
#define ll long long
using namespace std;
int main()
//當能平鋪完肯定是平鋪詢問次數最小
else
cout<
return 0;
}//45 64 54 67 //18 10 8 16
51nod 1246 罐子和硬幣
有n個罐子,有k個硬幣,每個罐子可以容納任意數量的硬幣。罐子是不透明的,你可以把這k個硬幣任意分配到罐子裡。然後罐子被打亂順序,你從外表無法區別罐子。最後罐子被編上號1 n。每次你可以詢問某個罐子,如果該罐子裡有硬幣,則你可以得到1個 但你不知道該罐子中還有多少硬幣 如果該罐子是空的,你得不到任何硬...
51Nod 1246 罐子和硬幣
acm模版 這裡需要強調的是,分配是我們決定的,拿的方案也是我們決定的,所以,這裡預設是我們知道每個罐子可能擁有的硬幣個數。一開始沒有讀懂這層隱藏條件,所以自己想了半天也沒有想通樣例 接著,我們需要考慮的是兩大種情況四小種情況 第一 無抓空情況,結果一定是c次。1 每個罐子的硬幣個數我們都知道 一定...
51nod1246 罐子和硬幣
有n個罐子,有k個硬幣,每個罐子可以容納任意數量的硬幣。罐子是不透明的,你可以把這k個硬幣任意分配到罐子裡。然後罐子被打亂順序,你從外表無法區別罐子。最後罐子被編上號1 n。每次你可以詢問某個罐子,如果該罐子裡有硬幣,則你可以得到1個 但你不知道該罐子中還有多少硬幣 如果該罐子是空的,你得不到任何硬...