1 条题解

  • 0
    @ 2025-5-8 20:39:09
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    using namespace std;
    #define exp 0.000001
    double ans,dis[15],val;
    int n,power[15],end;
    double cal(double p)
    {
        double ret=0;
        for(int i=0;i<n;i++)
            ret+=dis[i]*pow(p,end-power[i]+1);
        return ret;
    }
    double bin(double L,double R)
    {
     
        if(R-L<exp) return L;
        double mid=(L+R)/2;
        double get=cal(mid);
        //printf("->%.5f %.5f %.5f\n",L,R,get);
        if(get>=val) return bin(L,mid);
        else return bin(mid,R);
    }
    int main()
    {
        int cas=1;
        while(scanf("%d",&n) && n!=-1)
        {
            for(int i=0;i<n;i++)
                scanf("%d%lf",&power[i],&dis[i]);
            scanf("%d%lf",&end,&val);
            if(cas>1) printf("\n");
            printf("Case %d: %.05f\n",cas++,bin(1,2)-1);
        }
        return 0;
    }
    
    1. 数据读取与初始化:通过 scanf 函数读取投资次数 n,每次投资的月份 power[i] 和金额 dis[i],以及投资结束的月份 end 和投资结束时的总价值 val。同时初始化测试用例编号 cas
    2. 计算函数 cal:定义 cal 函数,该函数用于计算在给定利率 p 的情况下,根据每次投资的金额 dis[i] 和投资月份 power[i],以及投资结束月份 end,计算出投资结束时的总价值。计算方式是对每次投资按照复利公式计算其在投资结束时的价值并累加。
    3. 二分查找函数 bin:使用二分查找的方法来寻找满足投资结束时总价值为 val 的利率 p。二分查找的区间初始为 [1, 2],每次取区间中点 mid,通过 cal 函数计算在该利率下的投资总价值 get。如果 get 大于或等于 val,则在左半区间 [L, mid] 继续查找;否则在右半区间 [mid, R] 继续查找。当区间长度小于预先定义的精度值 exp 时,认为找到了合适的利率,返回该利率值。
    4. 结果输出:对于每个测试用例,调用 bin 函数获取等效月利率,将其减 1(因为二分查找的初始区间是 [1, 2],得到的利率是 1 + 实际利率 的值),然后按照格式输出测试用例编号和该利率,每个测试用例的输出之间根据要求添加空行。

    通过二分查找和复利计算,来确定使得投资在给定时间达到给定总价值的等效固定月利率。

    • 1

    信息

    ID
    1200
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者