您的位置:首页 > 其它

51Nod-罐子和硬币(思维题)

2016-10-31 13:40 369 查看


1246 罐子和硬币


题目来源: FaceBook HackerCup 比赛题

基准时间限制: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 2


Output示例
4






李陶冶 (题目提供者)

这题看着简单,实际不好想,堪称经典题

思路:

1.假如k个硬币可以全部均分在n个罐子里的话,答案一定是c,因为在均分的情况下你才能知道罐子里硬币得分配情况

2.当m个硬币不能均分的情况下,一定是要保证空罐子尽可能的少,但是非空罐子里硬币要装尽可能的多比如n=150,k=451,c=451

的情况,此时最优解一定是489,因为这时候不但不能均分,更不能让空罐子太多,此时只能让每个非空罐子装4个,这样不但能保证

空罐子不多,同时非空罐子也会尽可能装更多的硬币。

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<limits.h>
#include<iostream>
#include<queue>
#include<math.h>
#include<stack>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 100005
#define Mod 1000000007
typedef long long ll;
int  main()
{
ll n,m,k,i,j,x,y,ans=0,t=0;
scanf("%lld%lld%lld",&n,&m,&k);
x=m/n;y=n-m%n;
if(k<=x*n || m%n==0)
printf("%lld\n",k);
else
{
y=m/(x+1);
ans+=n-y+k;
printf("%lld\n",min(ans,k+y));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: