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

· · 题解

发个萌新便于理解的解题思路

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>days[i];
    }

一开始的输入就不说什么了。

for(int i=1;i<=n;i++)
    {
        if(days[i]==1)
        {
            if(l!=0)
            {
                cnt-=1<<(l-1);
            }
            if(cnt<0)
            {
                cnt=0;
            }
            l=0;
            cnt++;
            marks++;
            if(cnt>=3)
            {
                marks++;
            }
            if(cnt>=7)
            {
                marks++;
            }
            if(cnt>=30)
            {
                marks++;
            }
            if(cnt>=120)
            {
                marks++;
            }
            if(cnt>=365)
            {
                marks++;
            }
        }else
        {
            l++;
        }
    }

每次签到的时候先判断离线天数并减去相应的在线天数,根据在线天数的多少判断应该获得多少积分。虽然很繁琐但便于理解。

    cout<<marks;
    return 0;
}

结束。

总体来说理解难度不大,适合萌新。

当然我也是一只萌新。

下面是全部的代码

#include<iostream>
using namespace std;
int n;
int days[1086];
int cnt;
int l;
int marks;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>days[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(days[i]==1)
        {
            if(l!=0)
            {
                cnt-=1<<(l-1);
            }
            if(cnt<0)
            {
                cnt=0;
            }
            l=0;
            cnt++;
            marks++;
            if(cnt>=3)
            {
                marks++;
            }
            if(cnt>=7)
            {
                marks++;
            }
            if(cnt>=30)
            {
                marks++;
            }
            if(cnt>=120)
            {
                marks++;
            }
            if(cnt>=365)
            {
                marks++;
            }
        }else
        {
            l++;
        }
    }
    cout<<marks;
    return 0;
}