模拟~!
好久没有1A了。。。泪奔。。
这题好早以前看过,因为太长了所以就放过去了 = =。。今天小盆友问我这题的题意,我就又看了下。。。索性给做了。。跟小朋友说,咱俩比比谁先做出来吧~嘻嘻。。。我先A的,吼吼~
题意是这样的,如果是上升序列,上升序列的长度不是所有上升数字的,是这么规定的,如果它与前一个数字构成上升,那么这个数字算上长度。所以说,比如1 2 3 4 5 ,这个长度为4。
输出上升序列的平均长度,就是所有上升序列加和/上升序列个数。
比如最后一个样例,1 2 3 2 3 4 5,上升序列有1 2 3 , 2 3 4 5 ,长度为2 + 3 = 5,个数为2,所以输出5.0/2.0 = 2.5
如果有重复数字,比如4 4 4 3 3 3 3 ,那么这整个是下降序列;
再如4 4 4 3 3 3 4 ,则前6个是下降,后俩是上升。这个蛮纠结的感觉 = =。。。
但是这个重复数字等于说就开头是重复的话跟下面的序列有关系,如果中间重复的话,它其实已经算某个序列里了。
具体的,见注释吧。这个不难想,就是实现的细节需要想一下。
小盆友受打击了。。。其实没关系的。。。不会就先放放。。。等自己有了自信再回来干掉它。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; int num[35]; int main() { int len,i,n,x,flag,up,upnum,down,downnum,tmp,ff; while( scanf("%d",&n) && n ) { len = 1; num[0] = n; while( scanf("%d",&x) && x ) num[len++] = x; up = upnum = down = downnum = tmp = 0; ff = flag = 0; for(i=1; i<len; i++) { if( num[i] == num[i-1] ) { if( !flag && !ff ) tmp++; if( flag ) //如果之前是降序,那么这个数字也是属于降序里的,下同。 down++; if( ff ) up++; } if( num[i] < num[i-1] ) { ff = 0; //遇到降序,就把升序的标记给去了,下同。 if( !flag ) { flag = 1; // 降序的个数加1,避免重复加,标记下。 downnum++; } down++; down += tmp; // 其实这点只和开头是重复数字的有关,下同。 tmp = 0; } if( num[i] > num[i-1] ) { flag = 0; if( !ff ) { upnum++; ff = 1; } up++; up += tmp; tmp = 0; } } double ansup,ansdown; if( upnum == 0 ) // 如果没有这种序列,要输出0的(防止除0),下同。 ansup = 0; else ansup = (double)up/upnum; if( downnum == 0 ) ansdown = 0; else ansdown = (double)down/downnum; printf("Nr values = %d: %.6lf %.6lf/n",len,ansup,ansdown); } return 0; }