MATHHEW

导航

hihoCoder#1051

 

刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正。

 

时间限制:2000ms
单点时限:1000ms
内存限制:256MB

描述

小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>n,就直接输出100就可以,否则就要求出最大的连续天数。

求解最大的连续天数:求出各个间隔,将任连续的m+1个间隔相加,这些连续间隔的最大值就是最终变成的最大连续天数。

#include<stdio.h> 

int GetMaxNum(int *p,int n,int m);

int main()
{
    int n,m,i=0,j,gnum;
    int *pn,*day;
    scanf("%d",&gnum);
    day=(int*)malloc(gnum*sizeof(int));
    for(j=0;j<gnum;j++)
    day[j]=0;
    while(i<gnum)
    {
        scanf("%d%d",&n,&m);
        pn=(int*)malloc(n*sizeof(int));
        for(j=0;j<n;j++)
        scanf("%d",&pn[j]);
        day[i]=GetMaxNum(pn,n,m);
        i++;
    }
    for(i=0;i<gnum;i++)
    printf("%d\n",day[i]);
    free(pn);
    free(day);
    return 0;
}

int GetMaxNum(int *p,int n,int m)
{
    int i,j,k,day_b[n+1],sumday=0,sumday_l;
    if(m>=n)
    return 100;
//得到连续天数数组 
    day_b[n]=100-p[n-1];
    j=1;
    for(i=0;i<n;i++)
    {
        day_b[i]=p[i]-j;
        j=p[i]+1;
    }
//得到m个连续间隔之和最大值
    for(i=0;i<n+1-m;i++)
    {
        sumday_l=0;
        for(j=i;j<m+i+1;j++)
        {
            sumday_l+=day_b[j];
        }
        if(sumday_l>sumday)
        sumday=sumday_l;
    }
    return sumday+m;
}

 




posted on 2015-10-02 21:14  MATHHEW  阅读(170)  评论(0编辑  收藏  举报