hiho 1015 : 提交補卡

描述

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章