码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 985D

时间:2018-06-10 11:47:09      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:turn   二分   代码   its   int   关系   span   分享图片   color   

题意略。

思路:这个题本来打算先推一下公式,然后解方程来算。函数图像大概如下:

技术分享图片

 

最左端为H。但是由于中间那个尖的地方(假设它的高度为h),可能在那个地方有多堆沙包,所以推公式貌似不行。

但是最高高度h和面积之间是存在函数关系的,所有堆沙堡的方式应该都是类似于这样的。所以我们想找出一个方式,使得所用沙包数为n,

且占地最少。也是就说我们要找出最高的且合法的h,并算出它的占地。

详见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

LL n,H;

LL cal(LL h){
    LL ret = 0;
    ret += h * (h + 1) / 2;
    if(h > H){
        ret += (H + h - 1) * (h - H) / 2;
    }
    return ret;
}

int main(){
    scanf("%lld%lld",&n,&H);
    LL lft = 1,rht = 1500000000;
    LL ans = n;
    while(lft < rht){
        LL mid = (lft + rht + 1)>>1;
        LL area = cal(mid);
        if(area <= n){
            lft = mid;
            LL temp = mid;
            if(mid >= H)
                temp += (mid - H); 
            LL last = (n - area);
            temp += last / mid + (last % mid > 0);
            ans = min(ans,temp);
        }
        else{
            rht = mid - 1;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

这里要注意一下,二分的右端值rht,由于在最差情况下,h * (h + 1) / 2 = 1e18,也就是说,hmax = sqrt(2 * 1e18),因此设置为1.5 * 1e9。

 

Codeforces 985D

标签:turn   二分   代码   its   int   关系   span   分享图片   color   

原文地址:https://www.cnblogs.com/tiberius/p/9162220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!