题目
题解思路
之前只听说过三分,这是第一次写三分的题目,没想到是在区域赛真题上。
根据期望公式二阶导推断出是凹函数,三分求凹点。
铜牌题就几十行。
公式以及三分算法参考这个博客
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
int n , m ;
long double p ;
long double ksm(long double di , int mi )
{
long double res = 1 ;
while ( mi )
{
if ( mi & 1 )
res = res*di ;
mi >>= 1 ;
di *= di ;
}
return res ;
}
long double f(int k )
{
return ((long double)k*n+m)/(1-ksm(1-p,k)) ;
}
void solve()
{
cin >> n >> m >> p ;
p*=(1e-4) ;
int t1 = 1 , t2 = 1e9 + 10 ;
while ( t1 < t2 )
{
int mid = t1 + (t2-t1)/3 ;
int mmid = t2 - (t2-t1)/3 ;
if ( f(mid) < f(mmid) )
t2 = mmid - 1 ;
else
t1 = mid + 1 ;
}
printf("%.10f",f(t2)) ;
}
int main()
{
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T ;
cin >> T ;
while (T--)
solve() ;
return 0 ;
}