题解:P10320 勇气(Courage)
xingshuyan000 · · 题解
update on 2024/12/22:重新排版了一下 LaTeX,然后更新了一下码风。
题目分析
其实这道题就是个纯数学题,先要找到规律,然后再对解这道题的公式进行推导,把公式推出来以后,再考虑一下一些特殊情况,然后这道题基本就解决了。此题编程不难,但就是推导过程比较麻烦(其实也不算特别麻烦),需要用到高一上学期的数学内容,主要是指数和对数部分。
可以先列举前面几种情况,找一下规律。
设攻击力的初始值为
经过第一次变换,攻击力变为
看到这里以后,其实已经不难发现,经过
把分母乘到不等号右边并化简,得
可以把
把
再进行移项、合并同类项,得
把
再对
其实这就已经出来了,直接编程,算出来
不过这道题当中有一些特殊情况需要判断:
-
当
x=2 时,因为无论经过多少次变换,x 的值一直是2 或4 ,所以此时当n > 2 的时候,无解,输出inf。 -
当
x\ge 2^n 时,经过指对数互化,可以得到\log_2x \ge n ,此时不用经过强化就可以满足要求,所以直接输出0 ,然后结束程序。 -
当
x^2 \ge 2^n 时,经过指对数互化,可以得到2\log_2x \ge n ,此时只需要强化一次就可以满足要求,所以直接输出1 ,然后结束程序。
而且请注意:先判断特殊情况,而且一定要按照上面这三个特殊情况的顺序编程,即先判断输出 inf,再判断输出 (我最开始特判顺序就搞错了,就导致一直有3个测试点过不去)
好了,分析完了,上代码。
Code
#include<bits/stdc++.h>
using namespace std;
int x, n;
int main()
{
cin >> x >> n;
if(x == 2 && n > 2){ //特判输出inf的情况
cout << "inf";
return 0;
}
if(log2(x) >= n){ //特判输出0的情况
cout << "0";
return 0;
}
if(2 * log2(x) >= n){ //特判输出1的情况
cout << "1";
return 0;
}
double a1, a2; //a1是等号右边对数的真数中的分母,a2是等号右边整个对数的值,记得开double
int ans; //存储答案
a1 = log2(x) - 1;
a2 = log2((n - 2) * 1.0 / a1);
ans = ceil(a2); //记得答案要向上取整
cout << ans;
return 0;
}