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

 

转载于:https://www.cnblogs.com/xlturing/p/3353871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值