博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 785C Anton and Fairy Tale 二分
阅读量:4699 次
发布时间:2019-06-09

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

题意:

有一个谷仓容量为\(n\),谷仓第一天是满的,然后每天都发生这两件事:

  1. 往谷仓中放\(m\)个谷子,多出来的忽略掉
  2. \(i\)天来\(i\)只麻雀,吃掉\(i\)个谷子

求多少天后谷仓会空

分析:

分类讨论:

1. \(n \leq m\)

每天都会把谷仓放满,所以第\(n\)后会变空

2. \(n > m\)

\(m\)天后谷仓还一直都是满的

\(m+1\)天后还剩\(n-m-1\),第\(m+2\)天后还剩\(n-m-1-2\)
\(m+i\)天后还剩\(n-m-\frac{i(i+1)}{2}\)
所以可以二分求出答案

注意到比较\(n-m>\frac{i(i+1)}{2}\)时,中间计算结果会溢出

所以可以通过除法来比较大小,令\(t=\frac{2(n-m)}{i(i+1)}\)

  • \(t>1\),有\(n-m>\frac{i(i+1)}{2}\)
  • \(t=0\),有\(n-m<\frac{i(i+1)}{2}\)
  • \(t=1\),这时\(i(i+1)\)的值不会太大,可以通过直接计算比较大小
#include 
#include
using namespace std;typedef long long LL;LL n, m;bool ok(LL x) { x -= m; LL t = n - m; t <<= 1; t /= x; t /= x + 1; if(t > 1) return false; if(!t) return true; return n - m == x * (x + 1) / 2;}int main(){ scanf("%lld%lld", &n, &m); if(n <= m) { printf("%lld\n", n); return 0; } LL L = m + 1, R = n; while(L < R) { LL M = (L + R) / 2; if(ok(M)) R = M; else L = M + 1; } printf("%lld\n", L); return 0;}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/6569234.html

你可能感兴趣的文章
poj 3630 Phone List trie树
查看>>
mongo 主从数据不同步
查看>>
nodejs之async异步编程
查看>>
caffe的运行create_data.sh前对VOC2007图片格式的更改
查看>>
train_val.prototxt文件和deploy.prototxt文件开头的区别
查看>>
部署 dashboard 插件
查看>>
hdu 2191 (多重背包二进制优化)
查看>>
C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式...
查看>>
19_01访问权限修饰符
查看>>
HDU1506
查看>>
Linq中常用的方法
查看>>
翻译:TRUNCATE TABLE(已提交到MariaDB官方手册)
查看>>
ASP.NET MVC 5 自动生成的代码框架
查看>>
在ASP.NET Core 2.2 中创建 Web API并结合Swagger
查看>>
新装Windows 2003 + IIS 6.0的问题
查看>>
http基础
查看>>
学习Selenium 自动化从一张藏宝图开始
查看>>
第一次冲刺阶段(五)
查看>>
Android ADB 用法
查看>>
Chaos网络库(三)- 主循环及异步消息的实现
查看>>