ZOJ Problem Set - 1338 Up and Down Sequences 解释 ac代码
这道题目我一开始一头雾水,怎么都数不对,参考了下网上的博文,才弄懂。
题意是这样的,如果是上升序列,上升序列的长度不是所有上升数字的,是这么规定的,如果它与前一个数字构成上升,那么这个数字算上长度。所以说,比如1 2 3 4 5 ,这个长度为4。(这里感觉蛮奇怪的,理解了这里就基本ok了),举个例子:
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个是下降,后俩是上升。
见ac代码
#include <stdio.h> int main() { int pre; while(scanf("%d",&pre)!=EOF&&pre) { int now,up=0,down=0,num=1,equ=0,upNum=0,downNum=0,flag=0;//flag标记分为0,1,2,3四种状态,0为初始状态 while(scanf("%d",&now)!=EOF&&now) { if(now>pre) { if(flag==1) { up++; } else if(flag==2||flag==0) { up++; flag=1; upNum++; } else if(flag==3) { up+=equ; up++; equ=0; flag=1; upNum++; } } else if(now<pre) { if(flag==1||flag==0) { down++; flag=2; downNum++; } else if(flag==2) { down++; } else if(flag==3) { down+=equ; down++; equ=0; flag=2; downNum++; } } else { if(flag==0||flag==3) { equ++; flag=3; } else if(flag==1) { up++; } else if(flag==2) { down++; } } num++; pre=now; } double uplen,downlen; if(upNum==0) { uplen=0; } else { uplen=double(up)/upNum; } if(downNum==0) { downlen=0; } else { downlen=double(down)/downNum; } printf("Nr values = %d: %.6lf %.6lf\n",num,uplen,downlen); } return 0; }