#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%的数据1nkm1001\le n、k\le m \le 100

对于100%的数据1nkm1051\le n、k\le m \le 10^5

提示

暴力枚举即可获得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]得到。