皎日以為期之qq連續登陸時間問題——貪心
阿新 • • 發佈:2018-12-08
I - 皎日以為期
xcp學長特別關注QQ達人,從註冊QQ到現在已經有一百天了,xcp學長檢視自己的QQ達人登入記錄發現因為太痴迷於學習有m天忘記登入了,通過補登卡獲取祕籍瞭解到QQ語音單次通話滿十五分鐘可以獲得一張補登卡,每張補登卡可以補回一天的登入,於是xcp學長與pht,hjk,kd,wcl,jc,gq…等n位學長進行了單次滿十五分鐘的通話,現在xcp學長想知道使用n張補登卡後最長的連續登入的天數。
Input
第一行是一個整數t(1 <= t <= 10),代表測試資料的組數。
每個測試資料第一行是2個整數m和n(0 <= n, m<= 100)。第二行包含m個遞增不大於100的整數a1,a2,a3…am,表示xcp學長在第a1天,第a2天,第a3天…第am天沒有登入QQ。
Output
對於每組資料,輸出使用n張補登卡後最長連續登入的天數,每組資料佔一行。
Sample Input
3
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90
解題思路
貪心問題,m次補籤卡,求最長連續登陸天數。如果補籤卡大於等於忘記登陸的天數,就直接輸出100,否則列舉m個補籤卡的位置,記住一定是連續的。
以下為實現過程
#include <stdio.h>
#include <string.h>
int main() {
int t,m,n,num[105],maxx,ans; //maxx記錄最長連續登陸的天數
scanf("%d",&t); //num陣列記錄忘記登陸的時間
while(t--){ //臨時變數,記錄每一次可能的結果和最大值比較
memset(num,0, sizeof(num));
maxx=0;
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
scanf("%d",&num[i]);
if(n>=m){ //補籤卡夠直接輸出100
printf("100\n");
continue;
}
for(int i=0;n+i<=m;i++){
if(n+i==m) //特判補籤最後一天的情況
ans=100-num[i-1]-1;
if(i==0) //特判補籤第一天的情況
ans=num[n]-1;
if(i!=0 && n+i!=m)
ans=num[n+i]-num[i-1]-1;
if(ans>maxx) maxx=ans; //類似打擂臺的方式迭代求出最大值
}
printf("%d\n",maxx);
}
return 0;
}