#HT1045. [普及]打卡日
[普及]打卡日
题目背景
叮叮老师的每日一题活动增加了新的规则:连续打卡会有积分的累加,比如连续打了两天就会额外获得1分,连续三天时候第三天额外获得2分……连续20天第20天能多获得19积分!
但是中间一旦断开,就需要重新开始累计……小A在20天打卡的过程中漏掉了几天,他向叮叮老师询问有没有补卡机会,很显然,这是没有的😏
题目描述
小A想算一算,至少有几天补上卡,才可以形成连续K天的打卡。
输入格式
第一行为三个整数m,k,n。
分别表示一共有m天打卡、要形成连续k天的打卡、以及有n天没有打卡。
第2行到第n+1行有n个整数,分别表示哪些天没有打卡。
输出格式
一个整数,表示想要连续k天打卡,至少要补卡的天数。
样例
10 6 5
2
10
1
5
9
1
样例解释
一共打卡了10天,有5天没有打卡。
分别是第1、2、5、9、10天。
那么打卡的就是3、4、6、7、8天。
显然只要第五天补卡成功就可以形成3、4、5、6、7、8的连续6天的打卡。
数据范围
对于60%的数据
对于100%的数据
提示
暴力枚举即可获得60分,想要获得100分,我们需要使用前缀和算法。
假设我们要求a数组中l位置到r位置的和,普通方法是使用一个for循环for(int i=l;i<=r;i++)
,然后累加所有a[i]
的值,这样是可以的。
但如果是多次求一个区间的和,使用这种普通的方法,时间复杂度就会很高,此时我们可以使用前缀和算法,用一个sum数组,遍历一遍a数组,让sum[i]=sum[i-1]+a[i]
这样得到的sum数组之后,再求l到r之间a[i]的和就可以用sum[r]-sum[l-1]
得到。