博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 985D
阅读量:4317 次
发布时间:2019-06-06

本文共 1059 字,大约阅读时间需要 3 分钟。

题意略。

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

 

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

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

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

详见代码:

#include
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。

 

转载于:https://www.cnblogs.com/tiberius/p/9162220.html

你可能感兴趣的文章
简洁侧边wordpress博客模板
查看>>
linux及安全第四周总结——20135227黄晓妍
查看>>
搞出来,PHP mysql JQuery 二级联动
查看>>
AviSynth入门与应用指南
查看>>
ubuntu14.04安装GoldenDict
查看>>
重装系统时启动失败,引导信息有错误,修复磁盘的主引导记录MBR方法
查看>>
字符数组 字符指针
查看>>
Jedis的使用
查看>>
文献笔记(一)
查看>>
Linux(CentOS6.5)下修改Nginx初始化配置
查看>>
windows 重写调试输出
查看>>
反向代理服务器(Reverse Proxy)
查看>>
Android全屏
查看>>
HTML 标签。
查看>>
[bzoj2783][JLOI2012]树_树的遍历
查看>>
2018.10.20 bzoj1068: [SCOI2007]压缩(区间dp)
查看>>
Perl的IO操作(2):更多文件句柄模式
查看>>
由拖库攻击谈口令字段的加密策略
查看>>
Alpha 冲刺 (4/10)
查看>>
并发编程之线程池进程池
查看>>