题解 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;
}
好了,本蒟蒻就讲到这里,希望对读者有所帮助。