1. 程式人生 > >皎日以為期之qq連續登陸時間問題——貪心

皎日以為期之qq連續登陸時間問題——貪心

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