Codeforces Round #393 (Div. 2) - B

本文解析了CodeForces竞赛中一道关于分配枕头的问题。通过二分查找算法确定某人能获得的最大枕头数量,确保相邻人的枕头数差不超过1,并且每个人都至少有一个枕头。文章详细介绍了实现过程及关键步骤。

 

题目链接:http://codeforces.com/contest/760/problem/B

题意:给定n张床,m个枕头,然后给定某个特定的人(n个人中的其中一个)他睡第k张床,问这个人最多可以拿多少个枕头。保证n个人每个人至少
有一个枕头并且相邻两个人的枕头数目之差不能大于等于2.

思路:二分这个人的枕头数,然后就是总枕头数目最小=睡他左边的人的枕头数目都比右边少一个+睡他右边的人的枕头数目都比左边少一个+他的枕头数。
假设当前二分的的枕头数为val,那么左右两边的最小数目为以val为首项,-1位公差的等差数列。 还要注意不能出现负数,所以当某一人的数目为1时其他都
为1.

import java.io.PrintWriter;
import java.util.*;

public class Main {
    static long cal(long a1,long d,long n){
        a1=Math.max(a1, 1); //至少有一个。
        long k=Math.min(n,a1); //k个构成等差序列
        return k*a1+k*(k-1)/2*d+(n-k);  //等差序列求和+剩余都为1
    }
    static long check(long val,long k,long n){
        return cal(val-1,-1,k-1)+cal(val-1,-1,n-k)+val; //左边+右边+自己
    }
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);
        long n=cin.nextLong(),m=cin.nextLong(),k=cin.nextLong();
        long L=1,R=(m-(n-1)),mid;
        while(R>=L){ //二分。
            mid=(L+R)/2;
            if(check(mid,k,n)>m){
                R=mid-1;
            }else{
                L=mid+1;
            }
        }
        out.println(R);
        cin.close();
        out.flush();
    }
}

 

转载于:https://www.cnblogs.com/kirito520/p/6420252.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值