上一篇文章已经讲解了贪心算法的概念,以及使用场景:https://blog.csdn.net/butterfly_onfly/article/details/144600315
我们本章用贪心算法实现每日打开的功能
【题目描述】
连续打卡天数越多,每次打卡获得的奖励也就越多,同时连续天数加上一天。如果多天不打卡,连续天数仅仅只是减少,当遗漏天数越少,减少的天数也就越少。规则是减少2^(n-1)天,n为连续遗漏天数。连续天数在下一次打卡时清算,打卡连续天数不会小于0。也就是说,如果每隔一天打卡,那么连续天数就不会变了。
当连续天数达到以下天数时,给予不同的活跃值奖励:
1天:奖励1(千里之行,始于足下)
3天:奖励2(坚持3天了,加油!)
7天:奖励3(曜日轮回)
30天:奖励4(月圆月缺,习惯养成)
120天:奖励5(坚持四个月了!)
365天:奖励6(一年四季都坚持下来了!真不容易!)
小a N天前注册了一个账号,虽然当时立志每天都要打卡,但发现这不太容易做到。现在知道他N天的的打卡记录,小a希望得知他通过打卡,在n天能获得多少活跃值?
【输入格式】
第1行一个整数N(<=1000)。
接下来N行,每行一个整数1或0,代表当天是否打过卡。
【输出格式】
一个整数,表示获得的活跃值!
#include<cstdio>
#include<cmath>
int main()
{int n,t=0,a,d=0,m=0; //n:有n天 t:分数 a:只是存是否打卡的 d是累计天数 m是累计未打卡天数scanf("%d",&n); //输入nfor(int i=0;i<n;i++){scanf("%d",&a); //输入有没有打卡if(a==1){if(m>0) d-=pow(2,m-1); //减去未打卡的天数if(d<0) d=0; //如果小于0就回到0t++;d++;m=0; //未打卡天数清0,打卡天数+1,积分+1if(d>=3) t++; //如果打开天数超过3,积分额外+1if(d>=7) t++; //如果打开天数超过7,积分额外+1if(d>=30) t++; //如果打开天数超过30,积分额外+1if(d>=120) t++; //以此类推if(d>=365) t++;}else if(a==0) m++; //如果未打卡,m++}printf("%d",t); //输出结果return 0;
}