Codeforces 985D
Posted tiberius
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 985D相关的知识,希望对你有一定的参考价值。
题意略。
思路:这个题本来打算先推一下公式,然后解方程来算。函数图像大概如下:
最左端为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 ",ans); return 0; }
这里要注意一下,二分的右端值rht,由于在最差情况下,h * (h + 1) / 2 = 1e18,也就是说,hmax = sqrt(2 * 1e18),因此设置为1.5 * 1e9。
以上是关于Codeforces 985D的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 44#985DSand Fortress+二分
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段