题解 P1664 【每日打卡心情好】

· · 题解

小学生又来发题解了!

这道题使本蒟蒻终于知道了洛谷的打卡规则不知道是否是真的

废话不多说,我们先来解释一下题目并讲一下思路:

连续打卡1天至2天:奖励1活跃值

连续打卡3天至6天:奖励2活跃值

连续打卡7天至29天:奖励3活跃值

连续打卡30天至119天:奖励4活跃值

连续打卡120天至364天:奖励5活跃值

连续打卡365天以上:奖励6活跃值

如果有n天遗漏天数,连续打卡的天数减少2^(n-1)天。

很好,了解完思路,本蒟蒻接下来介绍一下我的思路。

两种情况: 1、读入当前数字,如果为1,也就是今天打卡了,判断前一天是否打卡,如果没有,减少2^(n-1)天。减完之后,判断当前连续打卡的天数达到什么级别,活跃值加上相应的值,有些变量记得清零。

2、读入当前数字,如果为0,也就是今天没打卡,连续遗漏天数+1

如果读者您还是不懂,请看下方代码(没让您抄)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstdlib>
#include<algorithm>//文件头不解释
using namespace std;
int n,a[100000],s,pd,jy,djy=1;//定义变量
int main()
{
cin>>n;//读入n
for(int i=1; i<=n; i++)
{
    cin>>a[i];//读入当前数字
    if(a[i]==1)//如果为1,也就是今天打卡了
    {
     djy=1;//将此变量初始化
     if(a[i-1]==0)//如果昨天没打卡
     {
     for(int j=1; j<pd; j++)djy*=2;//计算要减少多少天
     s-=djy//减去2^(n-1)天
     if(s<0)s=0;//如果小于零,将其变为零
     }
     s++,pd=0;//今天打卡了,s+1,将计算连续遗漏天数的变量归零
     if(s>=1&&s<=2)jy++;//连续打卡1天至2天:奖励1活跃值
     if(s>=3&&s<=6)jy+=2;//连续打卡3天至6天:奖励2活跃值
     if(s>=7&&s<=29)jy+=3;//连续打卡7天至29天:奖励3活跃值
     if(s>=30&&s<=119)jy+=4;//连续打卡30天至119天:奖励4活跃值
     if(s>=120&&s<=364)jy+=5;//连续打卡120天至364天:奖励5活跃值
     if(s>=365)jy+=6;//连续打卡365天以上:奖励6活跃值
    }
    if(a[i]==0)pd++;//如果今天没打卡,连续遗漏天数加1
}
cout<<jy;//输出最终活跃值
return 0;
}

好了,本蒟蒻就讲到这里,希望对读者有所帮助。