zoukankan      html  css  js  c++  java
  • Codeforces Round #393 (Div. 2)

    题目链接: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();
        }
    }
  • 相关阅读:
    不使用C++ 11的整数转字符串
    1090 危险品装箱(25 分)
    C++中vector,set,map自定义排序
    D
    7-2 幼儿园数学题(29 分)
    李白打酒
    C++ string和int相互转换
    1049 数列的片段和(20)(20 分)
    11. 盛最多水的容器
    7. 整数反转
  • 原文地址:https://www.cnblogs.com/kirito520/p/6420252.html
Copyright © 2011-2022 走看看