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