Frodo and pillows CodeForces - 760B (二分)

题目链接: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值