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