用c++解决简单的数学问题

【问题描述】
小明寒假下载了一款手机跑步 APP,激励自己坚持锻炼身体。该 APP 可以统计用户每天
跑步的路程,并给予相应的“金币”奖励。在用户的“金币”达到一定数量后,就可以兑换
一定的体育用品。
根据跑步路程 x 奖励金币的规则如下:
1、每天的前 1000 米可领取 0.3 金币(若未达到 1000 米则领取数量为零),之后的每 2000
米能领取 0.1 金币。为了引导用户适量运动,每天领取的金币数量不能超过 3。
2、用户只有在 APP 中点击“签到”才能领取当天路程对应的金币。
3、为了让用户能够每天坚持使用该 APP,在用户连续三天签到后,从第四天开始,用户
每天“签到”时领取的金币数可以在原金币计算方法的基础上乘以 2(当然前提是在第四天
时用户也点击“签到”,并且领的金币最多不能超过 6)。但之后只要有一天中断点击“签
到”,则又要重新连续签到三天,在第四天时才能继续获得金币加倍的优惠。
根据小明每天所跑路程以及签到的情况,统计小明 n 天后所拥有的金币总数。请设计程
序帮助小明统计拥有的金币总数。
【输入格式】
输入共有 n+1 行,第一行包含一个正整数 n,表示需要统计小明 n 天后的金币总数。接
下来有 n(1<=n<=100)行,每行两个正整数,xi(1<=xi<=100000)和 fi(1 或 0),分别表示第
i 天时小明所跑的路程以及当天小明是否进行了签到。fi 为 0 表示小明当天未点击“签到”,
为 1 表示小明当天点击“签到”。
【输出格式】
输出数据仅一行,表示 n 天后小明所拥有的金币总数,保留一位小数。
【输入样例】
6
600 1
2300 1
5000 1
56000 1
80000 0
57000 1
【输出样例】
9.8
【输入输出样例说明】
第一天:小明跑了 600 米,小于 1000 米,签到后得到 0 金币。
第二天:小明跑了 2300 米,前 1000 米可得金币 0.3;2300-1000=1300,不足 2000 米。
所以签到后可得 0.3 金币。
第三天:小明跑了 5000 米,在进行签到后,可得到的金币为:0.3+0.12=0.5。
第四天:小明跑了 56000 米,在进行签到后,应得的金币为: 0.3+0.1
27=3。由于是连
续第四天签到,所以实际得到 32=6 金币。
第五天:小明跑了 80000 米,但未进行签到,所以得到的金币为 0。
第六天:小明跑了 57000 米,进行签到后,应得的金币为::0.3+0.1
28=3.1。由于每天最
高获金不能超过 3,所以实际得到 3 金币。
根据上述每天获得的金币,小明 6 天后可获“金币”总数为 9.8。

#include<iostream>
#include<algorithm>
using namespace std;
int b=0;
double init(int cnt){
    if(cnt<1000) return 0;//小于1000 
    else if(b>=4){//如果签到超过三天 
        if((0.3+(cnt-1000)/2000*0.1)*2>6){//金币大于6返回6 
            return 6;
        }else{
            return 0.6+(cnt-1000)/2000*0.1*2;
        }
    }else{ 
        if((0.3+(cnt-1000)/2000*0.1)>3){//金币大于三返回3 
            return 3;
        }else{
            return 0.3+(cnt-1000)/2000*0.1;
        }
    }
}
int main(){
    int n,fi,f;
    cin>>n;
    double ans=0;
    for(int i=1;i<=n;i++){
        cin>>fi>>f;
        if(f==0){//没签到 
            b=0;//累计签到数清零 
            continue;
        }else{
            b++;//签到数加一 
            ans+=init(fi);//加金币 
        }
    }
    cout<<ans;
    return 0;
}

思路写注释里