• ZOJ Problem Set


    这道题目我一开始一头雾水,怎么都数不对,参考了下网上的博文,才弄懂。

    题意是这样的,如果是上升序列,上升序列的长度不是所有上升数字的,是这么规定的,如果它与前一个数字构成上升,那么这个数字算上长度。所以说,比如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
    ",num,uplen,downlen);
        }
    
        return 0;
    }
  • 相关阅读:
    Pytorch笔记
    Anaconda使用
    最大流最小割算法
    pycallgraph--使用pycallgraph绘制Python函数调用关系图
    论文表格--三线表
    0514数据结构--递归、排序和查找
    0511操作系统
    0510操作系统
    ACWING算法提高课-动态规划
    删括号
  • 原文地址:https://www.cnblogs.com/xlturing/p/3353871.html
Copyright © 2020-2023  润新知