描述
小Ho給自己定了一個(gè)宏偉的目標(biāo):連續(xù)100天每天堅(jiān)持在hihoCoder上提交一個(gè)程序。100天過去了,小Ho查看自己的提交記錄發(fā)現(xiàn)有N天因?yàn)樨澩嫱浱峤涣?。于是小Ho軟磨硬泡、強(qiáng)忍著小Hi鄙視的眼神從小Hi那里要來M張"補(bǔ)提交卡"。每張"補(bǔ)提交卡"都可以補(bǔ)回一天的提交,將原本沒有提交程序的一天變成有提交程序的一天。小Ho想知道通過利用這M張補(bǔ)提交卡,可以使自己的"最長連續(xù)提交天數(shù)"最多變成多少天。
輸入
第一行是一個(gè)整數(shù)T(1 <= T <= 10),代表測試數(shù)據(jù)的組數(shù)。
每個(gè)測試數(shù)據(jù)第一行是2個(gè)整數(shù)N和M(0 <= N, M <= 100)。第二行包含N個(gè)整數(shù)a1, a2, ... aN(1 <= a1 < a2 < ... < aN <= 100),表示第a1, a2, ... aN天小Ho沒有提交程序。
輸出
對于每組數(shù)據(jù),輸出通過使用補(bǔ)提交卡小Ho的最長連續(xù)提交天數(shù)最多變成多少。
樣例輸入
3
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90
樣例輸出
76
59
100
涉及枚舉的貪心問題,又讓我想到了今年剛結(jié)束的藍(lán)橋杯的一道貪心題,思路都差不多(后續(xù)題目官方發(fā)布后更新題解),涉及(枚舉·尺取·二分..)的貪心問題基本思路較為清晰,基本可以一遍AC
貪心+枚舉思路:根據(jù)補(bǔ)交卡的個(gè)數(shù),順序枚舉相鄰的缺勤天數(shù),記錄最大值
Java·AC代碼
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();//測試組數(shù)
int[] ans = new int[T];
for(int i = 0; i < T; i++) {
int n = sc.nextInt();//n天忘記提交
int m = sc.nextInt();//m張補(bǔ)交卡
int max = 0;
int[] forget_days = new int[n];//遺忘天數(shù)
for(int j = 0; j < n; j++)
forget_days[j] = sc.nextInt();
//Arrays.sort(forget_days);//題目已經(jīng)給出有序條件
if(m >= n)//全補(bǔ)
ans[i] = 100;
else {//不能全補(bǔ),采用以上思路
for(int k = 0; k < n - m + 1; k++) {
if(k == 0) {//第一個(gè)天數(shù)的特殊處理
max = forget_days[k + m] - 1;
continue;
}
if(k < n - m) {//不涉及到消除最后一天
max = Math.max(forget_days[k + m] -
forget_days[k - 1] - 1, max);
}else if(k == n - m) {//涉及100的處理
max = Math.max(100 - forget_days[k - 1], max);
}
}
ans[i] = max;
}
}
for (int i : ans) {
System.out.println(i);
}
}
}