题解:P13985 [PO Final 2023] 通胀 / Inflation

· · 题解

题目大意

给定小数 n30 个小数 a_i。你需要进行两种操作:

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 时归在方案一还是方案二结果都相等。