1 条题解

  • 0
    @ 2025-4-8 21:45:51

    题意分析:

    题目要求分析数字序列中的上升游程上升游程下降游程下降游程

    • 上升游程上升游程:连续非递减子序列(aia_i ai1a_{i-1}
    • 下降游程下降游程:连续非递增子序列(aia_i ai1a_{i-1}

    输入包含多行数字序列,每行以00结尾,单独一行的00表示输入结束。需要计算每个序列的平均上升游程长度平均上升游程长度平均下降游程长度平均下降游程长度,结果保留66位小数。

    解题思路:

    • 使用双指针法双指针法检测游程
    • 初始化时根据前两个元素两个元素确定初始游程类型
    • 遍历序列,当趋势变化时结束当前游程并开始新游程
    • 处理特殊情况:全等序列全等序列单元素序列单元素序列平台期平台期
    • 计算平均长度 = 总游程长度总游程长度 // 游程数量游程数量

    实现步骤:

    1. 读取输入直到遇到单独00

    2. 对每个序列:

      a) 初始化游程计数器游程计数器长度累加器长度累加器

      b) 使用双指针双指针检测游程:

      • 外循环指针外循环指针标记游程起点
      • 内循环指针内循环指针扩展游程终点

      c) 根据趋势变化更新游程统计

    3. 计算结果:

      a) 平均上升游程长度平均上升游程长度 = 上升总长度上升总长度 // 上升游程数上升游程数

      b) 平均下降游程长度平均下降游程长度 = 下降总长度下降总长度 // 下降游程数下降游程数

    4. 格式化输出结果

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    int a[64];
    int n;
    void deal()
    {
    	int up=0,down=0,upSum=0,downSum=0;	
    	int i,j;
    	for(i=1;i<n;){
    		if(a[i]<a[i+1]){
    			++up;
    			for(j=i+1;j<=n;++j)
    				if(a[j-1]<=a[j])
    					++upSum;
    				else
    					break;
    		}
    		if(a[i]>a[i+1]){
    			++down;
    			for(j=i+1;j<=n;++j)
    				if(a[j-1]>=a[j])
    					++downSum;
    				else
    					break;		
    		}
    		if(a[i]==a[i+1]){
    			int flag=0;
    			for(j=i+1;j<=n;++j)
    				if(a[j-1]<a[j]){
    					flag=1;
    					break;
    				}
    				else if(a[j-1]>a[j]){
    					flag=-1;
    					break;
    				}
    			if(flag==0)
    				break;
    			if(flag==1){
    				++up;
    				for(j=i+1;j<=n;++j)
    					if(a[j-1]<=a[j])
    						++upSum;
    					else
    						break;				
    			}
    			if(flag==-1){
    				++down;
    				for(j=i+1;j<=n;++j)
    					if(a[j-1]>=a[j])
    						++downSum;
    					else
    						break;					
    			}
    		}
    		i=j-1;
    	}
    	double f1,f2;
    	if(upSum==0)
    		f1=0;
    	else
    		f1=upSum*1.0/up;
    	if(downSum==0)
    		f2=0;
    	else
    		f2=downSum*1.0/down;	
    	printf("Nr values = %d:  %.6lf %.6lf\n",n,f1,f2);
    }
     
    int main()
    {
    	n=0;
    	while(1){
    		int x;
    		scanf("%d",&x);
    		if(x==0){
    			if(n==0)
    				break;
    			deal();
    			n=0;
    		}
    		else
    			a[++n]=x;
    	}
    	return 0;	
    }
    
    • 1

    信息

    ID
    493
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    19
    已通过
    1
    上传者