描述
小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;
}