刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正。
小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
首先如果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; }
原文:http://www.cnblogs.com/ZH-0/p/4852735.html