刚开始没读懂题目,英文一直是硬伤。
题目大意是:有一只(聪明的)猫要打扫房间,但不想自己一个人干,于是让它帽子里的猫出来帮忙(它会魔法?),它帽子里的猫的帽子里还有猫,它帽子里的猫的帽子里的猫的帽子里还有猫,等等。打扫房间的工作量不大,不需要那么的猫来帮忙,于是这只(聪明的)猫想到一个注意:“随着帽子的逐层变小,猫的身高也逐渐变小,会变到最小身高1,由身高为1的猫来打扫房间(嘻嘻……不用自己干咯)。“
在每层帽子里的猫的数量是个常数,N。每层帽子里的猫的身高是上一层的猫的身高的1/(N+1)倍。
猫的身高最小只能是1;
结果一定有猫要去打扫房间;
所有的猫的身高都为整数。
会给定最初那只猫(那只聪明的猫)的身高和要打扫房间的猫(身高为1的猫)的数量,请找出不用打扫房间的猫的数量及所有的猫的身高的总和。
解题思路:
首先如下写几组数据,推导出公式log(N+1)(firstHeight ) = log(N)(workers) = x,即 ln(firstHeight) * ln(N) = ln(workers) * ln(N + 1)
height: h h/(N+1) h/(N+1)^2 h/(N+1)^3 h/(N+1)^4 …… h/(N+1)^x = 1
amount:1 N N^2 N^3 N^4 …… N^x = workers
当workers = 1 即 N = 1 时,log(N)(workers) = 1或0,存在二义性, 因此此时:
notWorkers = log(2)(firstHeight) ,即等于指数x,因notworkers为整数,需利用ceil函数进行取整操作;
sumOfHeight = 2 * firstHeight - 1 ,由等比数列求和公式化计算化简得出。
当workers != 1 时:
notWorkers = (workers - 1) / (N - 1) ,由等比数列求和公式化计算化简得出;
sumOfHeight = (N + 1) * firstHeight - workers * N ,由等比数列求和公式化计算化简得出。
#include<stdio.h>
#include<math.h>
int main() {
int firstHeight, workers;
while (scanf("%d%d", &firstHeight, &workers) != EOF) {
if (!firstHeight && !workers)
break;
int notWorkers, sumOfHeight;
if (workers == 1) {
notWorkers = ceil(log(firstHeight) / log(2));
sumOfHeight = 2 * firstHeight - 1;
}
else {
int N;
for(N = 1; N < firstHeight; N++) {
if (fabs(log(firstHeight) * log(N) - log(workers) * log(N + 1)) < 1e-8)
break;
}
notWorkers = (workers - 1) / (N - 1);
sumOfHeight = (N + 1) * firstHeight - workers * N;
}
printf("%d %d\n", notWorkers, sumOfHeight);
}
return 0;
}
--------------------------------------------------------------------------------------------
Keep It Simple,Stupid!
--------------------------------------------------------------------------------------------