Codeforces Round #393 (Div. 2) -B. Frodo and pillows(贪心)

记录一个菜逼的成长。。

题目链接

题目大意:
有n张床,m个枕头。
每个人至少有一个枕头,相邻的床枕头数差不能超过1.问指定的床最多可以获得多少个枕头。

先每张床都给一个。
当床两边都有相邻的床位时。
然后优先给指定的床位,当差超过1时,我们需要给相邻的床位一个枕头。
所以要让指定的床位有两个枕头,要从剩余的枕头里拿出1个。
要让指定的床位有三个枕头,要从剩余的枕头里拿出4个.有两个给旁边的床位。
以此类推。
因为可能指定的床位两边的床数不相等。
所以要考虑多的一边。
当所有的床位超过1个时,每次只需要拿出n个。

#include <bits/stdc++.h>
using namespace std;
#define fin freopen("D://in.txt","r",stdin)
#define fout freopen("D://out.txt","w",stdout)
int main()
{
    //fin,fout;
    int n,m,k;
    while(~scanf("%d%d%d",&n,&m,&k)){
        int ans = 1;
        m -= n;
        int t = min(k,n-k+1),flag = 0;
        for( int i = 1; i <= t; i++ ){
            if(m < i*i){
                ans += i-1;
                flag = 1;
                break;
            }
        }
        if(!flag){
            m -= t*t;
            ans += t;
            flag = 0;
            int len = abs(n - 2*t + 1);
            for( int i = 1; i <= len; i++ ){
                if(m < (t-1)*i + (t+1+t+i)*i/2){
                    ans += i-1;
                    flag = 1;
                    break;
                }
            }
            if(!flag){
                m -= (t-1)*len + (2*t+1+len)*len/2;
                ans += len;
                ans += m / n;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值