1. 程式人生 > >HihoCoder#1051 補提交卡

HihoCoder#1051 補提交卡


描述

       小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

思路

M—補籤卡數量

       很明顯,補籤卡可以消掉M個數字,利用這一特性,將資料存入陣列中,對陣列元素隔M個相減得到差,取差中的最大值。

最大值減1即為連續簽到天數。例如: 10 30 55 56 90中 有2張補籤卡,從56開始作差,56-10得到46,循壞到下一個90,作差得60,顯然60為最大值。

        歡迎留言鴨!

 

程式碼

#include<stdio.h>
int main()
{
	int a[10][102];
	int num,i,j,max,temp;
	scanf("%d",&num);//輸入資料行數
	for(i=0;i<num;i++)
	{
		for(j=0;j<1||j<a[i][0]+2;j++)//先輸入第一個,然後迴圈條件變為j<a[i][0]+2
		scanf("%d",&a[i][j]);//輸入資料 第一個為漏籤的次數 第二個為補籤卡數
	}
	
	for(i=0;i<num;i++)
	{
		if(a[i][0]<=a[i][1])//補籤卡比漏籤多,顯然可以全勤
			max=101;
		else 
		{	
			j=a[i][1]+3;//j定位為可作差的第一個數
			max=a[i][j-1];//max定位為可作差的前一個數(相當於資料開頭有個0,它與0作差得到本身)
			temp=a[i][1]+1;//temp為補籤卡數加1,即隔開的元素個數
			for(   ;j<a[i][0]+2 ;j++)
			   if(a[i][j]-a[i][j-temp]>max)//作差比max大的話
			   {
				   max=a[i][j]-a[i][j-temp];
			   }
		}
		printf("%d\n",max-1);//列印max-1
	}
	return 0;
}