HihoCoder#1051 補提交卡
阿新 • • 發佈:2018-11-24
描述
小Ho給自己定了一個巨集偉的目標:連續100天每天堅持在hihoCoder上提交一個程式。
100天過去了,小Ho檢視自己的提交記錄發現有N天因為貪玩忘記提交了。於是小Ho軟磨硬泡、強忍著小Hi鄙視的眼神從小Hi那裡要來M張"補提交卡"。每張"補提交卡"都可以補回一天的提交,將原本沒有提交程式的一天變成有提交程式的一天。
小Ho想知道通過利用這M張補提交卡,可以使自己的"最長連續提交天數"最多變成多少天。
輸入
第一行
每個測試資料第一行是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;
}