洛谷-P1423 小玉在游泳
洛谷-P1423 小玉在游泳
题目描述
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小玉想知道,如果要游到距离x米的地方,她需要游多少步呢。请你编程解决这个问题。
输入格式
输入一个数字(不一定是整数,小于100m),表示要游的目标距离。
输出格式
输出一个整数,表示小玉一共需要游多少步。
输入输出样例
输入 #1
4.3
输出 #1
3
C++代码
#include <iostream>
using namespace std;
int main() {
int i;
double x,m=2,sum=0;
cin>>x;
for(i=0;sum<x;++i)
{
sum+=m;
m*=0.98;
}
cout<<i<<endl;
return 0;
}
题解
数学方法
O(1)时间复杂度
等比数列求和公式
\(S_n=\frac{a_1(1-q^n)}{1-q}(q\neq1)\)
每次游的距离为上一次的0.98倍,构成一个公比为0.98的等比数列
现要使其前ans项大于等于一个值
只要代入公式并向上取整即可
下附超短代码
#include<bits/stdc++.h>
double x;
int main()
{
std::cin>>x;
std::cout<<ceil(log(1-x/100)/log(0.98));
return 0;
}