https://codeforces.com/problemset/problem/1359/C
B题wa了2发,前期劣势巨大。。然后过完c题一看board竟然只有400人过了c,运气比较好没卡住。
可以知道偶数次的时候,温度都是(h+c)/2的,所以<=(h+c)/2的时候,最近的就是第二次
那么只要考虑奇数次,温度为((d+1)h+dc)/(2d+1)可以看到这个东西是递减的,无穷大的时候逼近(h+c)/2
那么只要二分找到最小的d使得calc(d)<t,那么最后答案要么是2*d+1,要么是2*d-1,算出差值的分数表示然后交叉相乘一下用整数表示就不用担心精度了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,cas,k;
ll h,c,tb,ans;
int a[maxl],b[maxl];
char s[maxl];
bool in[maxl];
inline void prework()
{
scanf("%lld%lld%lld",&h,&c,&tb);
h*=2;c*=2;tb*=2;
}
inline bool jug(ll n)
{
return (n+1)*h+n*c<tb*(2*n+1);
}
inline void mainwork()
{
if(tb==h)
{
ans=1;
return;
}
if(tb<=(h+c)/2)
{
ans=2;
return;
}
h/=2;c/=2;tb/=2;
ll l=1,r=2e6,mid,d;
while(l+1<r)
{
mid=(l+r)>>1;
if(jug(mid))
r=mid;
else
l=mid;
}
if(jug(l))
d=l;
else
d=l+1;
if(1.0*(tb*(2*d+1)-(d+1)*h-d*c)*(2*d-1)<1.0*(2*d+1)*(d*h+(d-1)*c-tb*(2*d-1)))
ans=2*d+1;
else
ans=2*d-1;
}
inline void print()
{
printf("%lld\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}