当前位置: 首页 > 工具软件 > tale-iiice > 使用案例 >

C. Anton and Fairy Tale-Codeforces Round #404 (Div. 2)-二分或者规律

双弘益
2023-12-01

队友推出的规律,后来百度都是用的二分,自己一想果然也是。
哪知道二分无限wa。
上限取得不一样,结果也不一样。。
m+1,m*2,0x3f3f,0x9f9f,都是一直wa,

后来看的题解,用的2e9。。这样保证平方不会超过结果。(可能因为有平方,要求那个数也不能大于范围吧)
1 2e9是恰好平方不会过long long的。
2 并且,如果天数是2e9的话,那么会把1e18的最大粮食吃掉的
3 最大天数绝不是 m和n。。妈蛋。
综上所述,这道题就是摆明要用二分,都是套路,。。。。
()
因为题目是
顺便科普一下数据范围
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

队友代码

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

int main()
{
        LL m,n;
        while(~scanf("%lld%lld",&n,&m))
        {
            if(n-m>0)
            {LL num=n-m;
            LL ans;
            LL k=(int)sqrt(2*num);
            if(k/2.0*(1+k)>=num)
                ans=k+m;
            else
            {
                k++;
                ans=k+m;
            }
            printf("%lld\n",ans);
            }
            else
            {
                printf("%lld\n",n);
            }
        }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{  ll m,n;
    scanf("%lld%lld",&m,&n);
     if(m<=n)
        {printf("%lld",m);return 0;}
     else
     {  ll r=2e9;
       ll l=0;
       ll ans=(m-n);
        for(int i=1;i<=100;i++)
         {   ll mid=(r+l)/2;
           if(mid*(mid+1)/2>=ans)
           {   r=mid;
           }
             else
                l=mid;
         }
         cout<<r+n<<endl;
     }
    return 0;
}
 类似资料: