题解:P13985 [PO Final 2023] 通胀 / Inflation
Chenxuhang_play
·
·
题解
题目大意
给定小数 n 和 30 个小数 a_i。你需要进行两种操作:
-
n\gets n+a_i
-
n\gets n\times(1+\dfrac{a_i}{100})
求 30 次操作后,n 的最大值。
思路
显然可以发现,对于 n < 100 时,方案一的结果比方案二大;对于 n > 100 时,方案二的结果比方案一的结果更大(结尾有证明)。在代码实现过程中,n=100 可以任意归在两种方案中,结果不变。记得存 double 类型。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n,ans;
cin>>ans;
for(int i=0;i<30;i++)
{
cin>>n;
if(ans>=100) ans*=(1.000+n/1.000/100);
else ans+=n;
}
cout<<fixed<<setprecision(10)<<ans;
return 0;
}
补充证明
当 n > 100 时:
\because \dfrac{n}{100}<1\\
\therefore n+a_i=n\times 1+a_i\times 1 > n\times 1+a_i\times \dfrac{n}{100}=n\times(1+\dfrac{a_i}{100})\\
\text{即 } n+a_i>n\times(1+\dfrac{a_i}{100})
所以方案一的结果大于方案二的结果。
当 n<100 时:
\because \dfrac{n}{100}>1\\
\therefore n+a_i=n\times 1+a_i\times 1 < n\times 1+a_i\times \dfrac{n}{100}=n\times(1+\dfrac{a_i}{100})\\
\text{即 } n+a_i<n\times(1+\dfrac{a_i}{100})
所以方案一的结果小于方案二的结果。
当 n=100 时:
\because \dfrac{n}{100}=1\\
\therefore n+a_i=n\times 1+a_i\times 1 = n\times 1+a_i\times \dfrac{n}{100}=n\times(1+\dfrac{a_i}{100})\\
\text{即 } n+a_i=n\times(1+\dfrac{a_i}{100})
所以当 n=100 时归在方案一还是方案二结果都相等。