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

来源:互联网 发布:java 游戏鲁滨逊漂流记 编辑:程序博客网 时间:2024/06/04 18:32

队友推出的规律,后来百度都是用的二分,自己一想果然也是。
哪知道二分无限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 1000000007int 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;}
0 0
原创粉丝点击