题目描述
Ivy所在的公司想推出一款手机APP“步步夺金”,该APP可以统计用户每天走路的步数,并给予相应的“金币”奖励。在用户的“金币”达到一定数量后,就可以在公司的网站上兑换一定的体育用品。
根据走路步数x奖励金币的规则如下:
1、每天的前1000步可领取0.3金币(若未达到1000步则领取数量为零),之后的每2000步能领取0.1金币。为了引导用户适量运动,每天领取的金币数量不能超过3。
2、用户只有在APP中点击“签到”才能领取当天步数对应的金币。
3、为了让用户能够每天坚持使用该APP,在用户连续三天签到后,从第四天开始,用户每天“签到”时领取的金币数可以在原金币计算方法的基础上乘以2(当然前提是在第四天时用户也点击“签到”,并且领的金币最多不能超过6)。但之后只要有一天中断点击“签到”,则又要重新连续签到三天,在第四天时才能继续获得金币加倍的优惠。
Ivy的任务是,根据用户每天所走步数以及签到的情况,统计用户n天后所拥有的金币总数。请帮助Ivy设计这个程序。
输入
输入共有n+1行,第一行包含一个正整数n,表示需要统计该用户n天后的金币总数。接下来有n(1<=n<=100)行,每行两个正整数,xi(1<=xi<=100000)和fi(1或0),分别表示第i天时用户所走的步数以及当天该用户是否进行了签到。fi为0表示用户当天未点击“签到”,为1表示用户当天点击“签到”。
输出
输出数据仅一行,表示n天后该用户所拥有的金币总数,保留一位小数。
样例输入 Copy
6
600 1
2300 1
5000 1
56000 1
80000 0
57000 1
样例输出 Copy
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.127=3。由于是连续第四天签到,所以实际得到32=6金币。
第五天:用户走了80000步,但未进行签到,所以得到的金币为0。
第六天:用户走了57000步,进行签到后,应得的金币为::0.3+0.128=3.1。由于每天最高获金不能超过3,所以实际得到3金币。
根据上述每天获得的金币,该用户6天后可获“金币”总数为9.8。
题意
给出用户每天的步数,计算最终所拥有的金币总数
根据走路步数x奖励金币的规则如下:
1、每天的前1000步可领取0.3金币(若未达到1000步则领取数量为零),之后的每2000步能领取0.1金币。为了引导用户适量运动,每天领取的金币数量不能超过3。
2、用户只有在APP中点击“签到”才能领取当天步数对应的金币。
3、为了让用户能够每天坚持使用该APP,在用户连续三天签到后,从第四天开始,用户每天“签到”时领取的金币数可以在原金币计算方法的基础上乘以2(当然前提是在第四天时用户也点击“签到”,并且领的金币最多不能超过6)。但之后只要有一天中断点击“签到”,则又要重新连续签到三天,在第四天时才能继续获得金币加倍的优惠。
分析
这是一道模拟题,按照题目描述的规则写就行
分析点1:
本题的一个重要的点在于理清奖励金币的规则。设每天的金币为s,步数为x。cnt为连续签到的天数。
步数的金币:
s(x) = max(3,s(x));
连续签到得金币:
s(x) = max(6,s(x));
分析点2:
在连续签到的奖励机制中,是在用户连续签到3天后的第四天开始金币数才会翻倍,这个值得注意。
分析点3:
对于n天,循环n次,每次读入两个正整数x和f,分别表示第i天用户所走的步数和当天是否进行了签到。对于每一天的数据,执行以下操作:
定义一个变量s用来计算当天的金币奖励,初始化为0。如果步数x大于等于1000,则用户可以领取0.3金币。如果步数x大于1000,计算超过1000步的部分,每超过2000步可以领取0.1金币。通过将(x-1000)除以2000得到超过1000步的部分,再乘以0.1得到金币奖励。将s与3取最小值,保证每天领取的金币数量不超过3。如果当天进行了签到,执行以下操作:
将t加1,表示连续签到的天数加1。如果t大于3,说明已经连续签到了三天,那么当天的金币奖励可以乘以2。将当天的金币奖励s加到sum中。
如果当天未进行签到,将t重置为0,表示连续签到的天数被中断。
代码:
#include
using namespace std;
int main()
{
int n;
int t = 0;
double s,sum = 0;
cin >> n;
int x,y;
for(int i = 1;i <= n;i++)
{
s = 0;
cin >> x >> y;
if(x >= 1000)
{
s += 0.3;
}
s += (x - 1000) / 2000 * 0.1;
s = min(3.0,s);
if(y == 1)
{
t++;
if(t > 3)
{
s = s * 2;
}
sum += s;
}
else
{
t = 0;
}
}
cout << sum << endl;
return 0;
}