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

· · 题解

这题其实可以很短

就是有些地方要注意

#include<cstdio>
#include<cmath>
int main()
{
    int n,t=0,a,d=0,m=0;   //n:有n天 t:分数  a:只是存是否打卡的  d是累计天数 m是累计未打卡天数
    scanf("%d",&n);       //输入n
    for(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就回到0
            t++;d++;m=0;                   //未打卡天数清0,打卡天数+1,积分+1
            if(d>=3) t++;                    //如果打开天数超过3,积分额外+1
            if(d>=7) t++;                    //如果打开天数超过7,积分额外+1
            if(d>=30) t++;                  //如果打开天数超过30,积分额外+1
            if(d>=120) t++;               //以此类推
            if(d>=365) t++;
        }else if(a==0) m++;         //如果未打卡,m++
    }
    printf("%d",t);              //输出结果
    return 0;
}