- 最优数学期望的分界点并不在区间中点处,因此需要整数三分,应当可以通过l=lmid+1、r=rmid-1收缩区间
- ACM时代,应当可以通过__gcd函数求最大公约数,不用自己手写了。【就算会编译错误也不计入罚时,试错成本极低】
- 对double比较相对大小的精度还是要有信心的,虽然这道题其实用不上double,稍微变形一下就好了
- 赛场上忘开long long了,万幸本题三分的结论应该是落在根号处,不会超精度,下次千万要谨慎
点击查看代码
//三分法求单谷函数极值
#include <bits/stdc++.h>
using namespace std;
long long t;
bool cmp(long long n1,long long n2)
{return (n1>n2)^(n1*n2>2*t);
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>t;long long l=1,r=t;while(l<r){long long lmid=(l+r)>>1,rmid=lmid+1;if(cmp(lmid,rmid)){r=rmid-1;}else{l=lmid+1;}}long long x=l*(l+1)/2+t-l;long long y=l;long long g=__gcd(x,y);x/=g;y/=g;cout<<x<<' '<<y<<"\n";}return 0;
}