题意:给你两个整数字N,K。N表示有个人要写N行东西,K是跟他的写东西效率有关的一个系数。这个人写东西写一会就累了就必须喝杯茶再写,他的效率会越来越低。需要求一个V值,V表示他依次能写等等,当这个值为零时他就睡着了。问你V最小为多少时,他才能写完这N行东西?
思路:二分一个V值,求出当前情况下可以写的行数sum如果小于N就继续二分大于V的部分,如果大于N就继续二分不大于V的部分,看V是否能够更小,如果等于V就跳出。
#include<bits/stdc++.h>
using namespace std;
int n,k;
int check(int v)
{
long long t = k,sum = v;
while(t <= n)
{
sum += v / t;
t *= k;
}
return sum;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
int l = 1,r = n,m = l + (r - l) / 2;
while(l < r)
{
if(check(m) < n) l = m + 1;
else r = m;
m = l + (r - l) / 2;
}
printf("%d\n",m);
}
return 0;
}