Codeforces 985D(二分答案)

传送门

题面:

 

D. Sand Fortress

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are going to the beach with the idea to build the greatest sand castle ever in your head! The beach is not as three-dimensional as you could have imagined, it can be decribed as a line of spots to pile up sand pillars. Spots are numbered 1 through infinity from left to right.

Obviously, there is not enough sand on the beach, so you brought n packs of sand with you. Let height hi of the sand pillar on some spot ibe the number of sand packs you spent on it. You can't split a sand pack to multiple pillars, all the sand from it should go to a single one. There is a fence of height equal to the height of pillar with H sand packs to the left of the first spot and you should prevent sand from going over it.

Finally you ended up with the following conditions to building the castle:

  • h1 ≤ H: no sand from the leftmost spot should go over the fence;
  • For any  |hi - hi + 1| ≤ 1: large difference in heights of two neighboring pillars can lead sand to fall down from the higher one to the lower, you really don't want this to happen;
  • : you want to spend all the sand you brought with you.

As you have infinite spots to build, it is always possible to come up with some valid castle structure. Though you want the castle to be as compact as possible.

Your task is to calculate the minimum number of spots you can occupy so that all the aforementioned conditions hold.

Input

The only line contains two integer numbers n and H (1 ≤ n, H ≤ 1018) — the number of sand packs you have and the height of the fence, respectively.

Output

Print the minimum number of spots you can occupy so the all the castle building conditions hold.

Examples

input

Copy

5 2

output

Copy

3

input

Copy

6 8

output

Copy

3

Note

Here are the heights of some valid castles:

  • n = 5, H = 2, [2, 2, 1, 0, ...], [2, 1, 1, 1, 0, ...], [1, 0, 1, 2, 1, 0, ...]
  • n = 6, H = 8, [3, 2, 1, 0, ...], [2, 2, 1, 1, 0, ...], [0, 1, 0, 1, 2, 1, 1, 0...] (this one has 5 spots occupied)

The first list for both cases is the optimal answer, 3 spots are occupied in them.

And here are some invalid ones:

  • n = 5, H = 2, [3, 2, 0, ...], [2, 3, 0, ...], [1, 0, 2, 2, ...]
  • n = 6, H = 8, [2, 2, 2, 0, ...], [6, 0, ...], [1, 4, 1, 0...], [2, 2, 1, 0, ...]

 

题目描述:

    你有n堆沙子,最左边的沙子的最大高度不能超过H,让你在一个从1到正无穷的一维平面内放沙子,且要满足相邻两个坐标的沙子的高度不能超过1。问沙子能够占用的最少坐标点的个数。

题目分析:

    这个题实质上有一个隐藏条件,因为题目要求相邻两个坐标的沙子高度不能超过1,这代表最后一堆沙子的个数也必定为1。而题目要我们求占用坐标点的最少个数,根据贪心的思想,要使占用的点最少,则我们必须要贪心地令沙子的高度尽可能高。然而又因为最后一堆的沙子的个数为1,因此我们可以判断出,沙子的高度所形成的曲线必定是先增后减的或者一直减小的曲线。即——沙子的高度存在单调性!因此我们就可以通过二分答案的方法,不断二分占用坐标的个数即可。

    而二分的check函数,我们因为最优的情况下,两两沙堆相差均为1,因此我们可以运用等差数列求和公式求出总的沙子堆数,并用它与n进行对比今儿二分即可。

    值得一提的是,当枚举出n为奇数的时候,会出现有两个坐标的值均相当的情况,需要格外留意!

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,h;
const ll cnt=2000000000;
bool check(ll x){
    if(x<=h){
        if(x>=cnt) return true;
        return x*(x+1)/2>=n;
    }
    ll a=(x-h)/2+h;
    if(a>=cnt) return true;
    if((x-h)%2!=0)
    return a*(a+1)/2+(a+h)*(a+1-h)/2>=n;
    return a*(a+1)/2+(a-1+h)*(a-h)/2>=n;
}
int main()
{
    cin>>n>>h;
    ll ln=1,rn=n;
    while(ln<=rn){
        ll mid=(ln+rn)>>1ll;
        if(check(mid)) rn=mid-1;
        else ln=mid+1;
    }
    cout<<rn+1<<endl;
}

 

 

 

 

 

转载于:https://www.cnblogs.com/Chen-Jr/p/11007283.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Codeforces估分是指在Codeforces比赛中预估自己在比赛结束后所能获得的分数。这个分数是考虑根据自己的表现和其他参赛者的表现来预估的。 Codeforces分数是根据比赛中的排名和成功解决问题的数量来计算的。在每场比赛结束后,每位参赛者会根据其在比赛中的表现被分配一个分数。比赛中排名越高的参赛者获得的分数也越高,而解决更多问题的参赛者同样也能获得更多分数。 Codeforces估分有两种方法:一种是通过比赛中的实时排名来估计当前分数,另一种是通过计算比赛中已解决问题的分数来估计最终的总分。 对于第一种方法,我们可以在比赛过程中观察自己在排名榜上的位置和其他参赛者的分数。如果自己的排名越高,说明自己的分数也会越高;如果其他人的分数与自己相差较大,说明他们可能已经解决了更多的问题,因此可能获得更高的分数。 对于第二种方法,我们可以根据已经解决的问题数量来估算总分。Codeforces的比赛系统会根据每个问题的难度和重要性分配不同的分数。因此,如果我们能成功解决更多的问题,我们也将获得更高的分数。 总的来说,Codeforces估分是一个根据比赛中的排名和解决问题的数量来估计自己分数的过程。但是,由于每场比赛的题目和参赛人数不同,预估分数可能有一定的不确定性。因此,我们建议在比赛过程中持续观察排名榜和其他参赛者的情况,以及时作出调整和优化自己的策略。 ### 回答2: Codeforces是一个在线的编程竞赛平台,每个竞赛都有一定的难度,需要通过编写代码来解决各种算法和数据结构的问题。Codeforces的估分指的是根据你在竞赛中的表现得出的一个评分。 在Codeforces竞赛中,你会根据你的解题情况和提交的答案是否正确来获得分数。每个问题都有一定的分值,解决该问题可以获得该分值的分数。如果你的答案是正确的,你将获得该问题的分数;如果你的答案是错误的,你将不会获得分数。 Codeforces的估分算法是基于Elo算法改进的。Elo算法是一种用于评估竞技选手水平的算法。该算法会根据你的表现和对手的水平来决定你的分数变化。如果你击败了一个分数比你高的选手,你的分数可能会上升得更多;如果你输给一个分数比你低的选手,你的分数可能会下降得更多。 Codeforces的估分也考虑了竞赛的参与人数。如果你在一个参与人数多的竞赛中获得了好的成绩,你的分数可能会得到进一步的提升。相反,如果你在一个参与人数少的竞赛中获得了好的成绩,你的分数可能会得到更少的提升。 总的来说,Codeforces的估分是根据你的表现、对手的水平和竞赛的参与人数来计算的。通过持续参与竞赛并取得好的成绩,你的分数将会逐渐提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值