罐子和硬币 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值