洛谷习题----P1664 每日打卡心情好

 

习题题目内容-------------链接

import java.util.Map;
import java.util.Scanner;

/**
 * @Author 陈平安
 * @Date 2022/8/29 9:25
 * @PackageName:PACKAGE_NAME
 * @ClassName: Main
 * @Description: TODO
 * @Version 1.0
 */
public class Main {
    static int days = 0;//打卡的天数
    static int activity = 0;//活跃值
    static int unhappy = 0;//未打卡的天数

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        int[] arr = new int[n + 1];//设置的数组的长度要预先加一
        //主要作用留作最后一天的打卡状态做对比
        //因为如果不是预先留下一位,在确定连续未打卡的天数的时候,
        // 容易超出数组的长度

        //看57行   if (arr[i + 1] != 0) 便知
        for (int i = 0; i < arr.length - 1; i++) {//这里有一个小陷阱,就是arr.length-1,因为初始化数组的时候
            //就多加一位数组元素,所以要减去一

            arr[i] = scanner.nextInt();

        }
//获取初始元素
        arr[n] = 3;//将最后一个数组元素设为1和0 之外的元素,方便截至连续天数

        for (int i = 0; i < arr.length - 1; i++) {//这里减一的道理也是上文的道理
            if (arr[i] == 1) {//判断是否是打卡
                days++;//如果打卡,打卡天数++
                if (days >= 1 && days <= 2) {
                    activity++;
                } else if (days >= 3 && days <= 6) {
                    activity += 2;
                } else if (days >= 7 && days <= 29) {
                    activity += 3;
                } else if (days >= 30 && days <= 119) {
                    activity += 4;
                } else if (days >= 120 && days <= 364) {
                    activity += 5;
                } else if (days >= 365) {
                    activity += 6;
                }//以上判断增加活跃值

            } else {//如果未打卡
                unhappy++;//未打卡的天数++
                if (arr[i + 1] != 0) {//判断明天是否是未打卡的状态,如果是,就不走下面的程序,继续
                    //把未打卡的天数++
                    //如果明天打卡,就把已经记录下的未打卡的天数。套入公式Math.pow(2, unhappy - 1);
                    //减去打卡的天数
                    days -= Math.pow(2, unhappy - 1);
                    if (days < 0) {//这里默认规定打卡的天数是非负数,所以增加一个校验,如果
                        //是负数就置为0
                        days = 0;
                    }
                    unhappy = 0;//这个很重要,因为在减去未打卡的天数以后,前面未打卡的天数就要置空的,不然就是一直累加
                }
            }
        }
        System.out.println(activity);//最后输出活跃值
    }
}

注解参看代码部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值