0
点赞
收藏
分享

微信扫一扫

罐子和硬币 51Nod - 1246


做这道题要先把逻辑理清楚 拿硬币的人很聪明但是点背 只要有可能抓空那他一定抓空(因为点背) 但是抓空的罐子就被排除(因为聪明)基于这个情况你给他安排如何放硬币 使他总的抓取次数最少 具体证明略 只说大体思路

分类讨论:

1  c<=(k/n)*n

这时我们一层层平均铺 必不会抓空

2  c>(k/n)*n

不可再按上述策略平均分配 可以自己找几个反例体会一下 比如 5 12 12

易得 总的抓取次数 = 抓到硬币次数 (c)+ 抓空次数 我们就要考虑如何使抓空次数最少

对于 5 12 12 如果均匀铺开 要抓15次 想得到最上面的两个要先抓空三次(点背)这时抓空次数等于硬币数少于(k/n+1)的罐子有多少个 推到一般情况就是 抓空次数 = n-k/(k/n+1) 就是说放硬币时对于每个罐子 只要硬币足够就放(k/n+1)个 不够那就等着抓空吧(还是点背)

那为啥非得是(k/n+1)呢 再多几个 比如(k/n+2)不行吗? 那咋不说把k个硬币都放一个罐子里呢 大方向肯定是首先尽量平均放 碰到第二种情况只是略微调整了一下策略

#include <bits/stdc++.h>
using namespace std;

int main()
{
int n,k,c;
while(scanf("%d%d%d",&n,&k,&c)!=EOF)
{
if(c<=(k/n)*n)
{
printf("%d\n",c);
}
else
{
printf("%d\n",c+n-k/(k/n+1));
}
}
return 0;
}



举报

相关推荐

0 条评论