Frodo and pillows CodeForces - 760B (二分)

本文介绍了一种解决CodeForces-760B枕头分配问题的方法,该问题要求在保证每个人至少有一个枕头且相邻两人枕头数量差不超过1的前提下,求第k个人最多能获得多少个枕头。通过先分配每人一个枕头,然后使用二分查找和等差数列求和的方式确定最大可能的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://cn.vjudge.net/problem/CodeForces-760B

题意给你n张床,m个枕头,要求每个人都得至少有一张床和一个枕头,但是相邻的两个人的枕头的数量差的绝对值不能超过1

问第k个位置的人最多可以有多少个枕头(在保证所有枕头都用完的情况下)

思路:先保证每个人都有一个枕头,再直接二分答案,通过求等差数列的和来判断答案大或小

等差数列的话  注意找到首项a1   和  项数N

#include <bits/stdc++.h>
#define ll long long
const int maxn = 1e5+5;
using namespace std;
ll n,m,k; 
bool solve(ll mid) {
    ll tempn=k;//k位置之前(包括k的项数)
    ll tempm=n-k;//k位置之后(不包括k的项数)
    ll a1 = mid - k + 1;//k位置之前的数列的首项,k当末项
    ll a2 = mid - n + k;//k位置之后的数列的首项,k-1当末项
    if(a1<=0) {//如果首项小于等于0代表,扩展不到第一项
        tempn-=(1-a1);
        a1 = 1;
    }
    if(a2<=0) {
        tempm-=(1-a2);
        a2 = 1;
    } 
    ll ans = tempn*(a1+mid) /2;
    ll ans1= tempm*(mid-1+a2)/2;  
    return ans+ans1<=m;
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&k);
    m-=n;
    ll l=1,r=m,ans=0;
    while(r>=l) {
        ll mid = l+r>>1;
        if(solve(mid)) {
            l=mid+1;
            ans = mid;
        }
        else
            r= mid-1;
    }
    printf("%lld\n",ans+1);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值