codeForces 165B.Burning Midnight Oil(二分)

て烟熏妆下的殇ゞ 提交于 2020-04-06 12:43:44

题意:给你两个整数字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;
}








发布了646 篇原创文章 · 获赞 57 · 访问量 14万+
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!