题解 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;
}