皎日以为期之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;
}

猜你喜欢

转载自blog.csdn.net/qq_43301061/article/details/83997450