不想融化的冰 2022-02-27 19:32 采纳率: 100%
浏览 56
已结题

用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。

  • 写回答

1条回答 默认 最新

  • zhengzhisheng6 2022-02-27 20:29
    关注
    #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;
    }
    

    思路写注释里

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 创建了问题 2月27日

悬赏问题

  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据