描述
小Ho給自己定了一個宏偉的目標:連續100天每天堅持在hihoCoder上提交一個程序。100天過去了,小Ho查看自己的提交記錄發現有N天因爲貪玩忘記提交了。於是小Ho軟磨硬泡、強忍着小Hi鄙視的眼神從小Hi那裏要來M張"補提交卡"。每張"補提交卡"都可以補回一天的提交,將原本沒有提交程序的一天變成有提交程序的一天。小Ho想知道通過利用這M張補提交卡,可以使自己的"最長連續提交天數"最多變成多少天。
輸入
第一行是一個整數T(1 <= T <= 10),代表測試數據的組數。
每個測試數據第一行是2個整數N和M(0 <= N, M <= 100)。第二行包含N個整數a1, a2, ... aN(1 <= a1 < a2 < ... < aN <= 100),表示第a1, a2, ... aN天小Ho沒有提交程序。
輸出
對於每組數據,輸出通過使用補提交卡小Ho的最長連續提交天數最多變成多少。
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
這題的關鍵是,要達到最大連續天數,使用補交卡的日期並需是按照順序相鄰的,知道這點就很好求解
#include <iostream>
#include <vector>
#define MAX 100
using namespace std;
int calculate(vector<int> dates,int M);
int useM(vector<int> dates,int idx, int num);
int main(void)
{
int T;
int N,M;
int date;
vector<int> dates;
for(cin>>T;T--;){
cin>>N;
cin>>M;
dates.clear();
for(int i=0;i<N;i++){
cin>>date;
dates.push_back(date);
}
cout<<calculate(dates,M)<<endl;
}
return 0;
}
int useM(vector<int> dates,int idx,int num){
if(idx == 0){
return (dates[idx+num] - 1);
}else if((idx+num-1) == dates.size()-1){
return (MAX - dates[dates.size()-2]);
}else{
return (dates[idx+num] - dates[idx-1]-1);
}
return 0;
}
int calculate(vector<int> dates,int M){
int count = 0;
int temp;
int end;
if(M>=dates.size()) return MAX;
else end = dates.size() - M;
for(int i=0;i<end;i++){
temp = useM(dates,i,M);
if(temp>count){
count = temp;
}
}
return count;
}