补提交卡
Time Limit: 1 Sec Memory Limit: 256 MB
小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序。100天过去了,小Ho查看自己的提交记录发现有N天因为贪玩忘记提交了。于是小Ho软磨硬泡、强忍着小Hi鄙视的眼神从小Hi那里要来M张”补提交卡”。每张”补提交卡”都可以补回一天的提交,将原本没有提交程序的一天变成有提交程序的一天。小Ho想知道通过利用这M张补提交卡,可以使自己的”最长连续提交天数”最多变成多少天。

传送门:HIHO1051

Input

第一行是一个整数T(1 <= T <= 10),代表测试数据的组数。 每个测试数据第一行是2个整数N和M(0 <= N, M <= 100)。第二行包含N个整数a1, a2, ... aN(1 <= a1 < a2 < ... < aN <= 100),表示第a1, a2, ... aN天小Ho没有提交程序。

Output

对于每组数据,输出通过使用补提交卡小Ho的最长连续提交天数最多变成多少。

Sample Input

1
2
3
4
5
6
7
3  
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90

Sample Output

1
2
3
76  
59
100

题解

一开始看得有点懵 参悟透了就会觉得很简单了 首先有两个规律想一想就能想出来 1.补交卡用得越多,连续提交天数越长(不超过100),所以肯定要用光补交卡(当补交卡小于等于漏交天数) 2.补交卡一定要连续的用,如果不连续地用是没有意义的 那么题目就可以转化成在N张补签卡里选择连续的m张卡使得提交天数最长。 那么枚举一下就好了 我这里在读数据时头加了0,尾部加了101,方便计算 像第一组数据,如果使用的是第一个补签卡,那么天数就是day[2]-day[0]-1,推广即day[i]-day[i-m-1]-1;
## AC code:(不包含输入类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;  
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int t=sc.nextInt();
for(int o=1;o<=t;o++){
int n=sc.nextInt();
int m=sc.nextInt();
int[] day=new int[n+2];
for(int i=1;i<=n;i++){
day[i]=sc.nextInt();
}
day[n+1]=101;
if(m>=n){
System.out.println(100);
}
else{
int max=-1;
for(int i=m+1;i<=n+1;i++){ //枚举所有段的终点
if(day[i]-day[i-m-1]-1>max){
max=day[i]-day[i-m-1]-1;
}
}
System.out.println(max);
}
}
}
}