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;
}

 

posted @ 2013-10-06 16:43  xlturing  阅读(374)  评论(0编辑  收藏  举报