1 条题解
-
0
题意分析:
题目要求分析数字序列中的和:
- :连续非递减子序列( )
- :连续非递增子序列( )
输入包含多行数字序列,每行以结尾,单独一行的表示输入结束。需要计算每个序列的和,结果保留位小数。
解题思路:
- 使用检测游程
- 初始化时根据前确定初始游程类型
- 遍历序列,当趋势变化时结束当前游程并开始新游程
- 处理特殊情况:、、
- 计算平均长度 =
实现步骤:
-
读取输入直到遇到单独
-
对每个序列:
a) 初始化和
b) 使用检测游程:
- 标记游程起点
- 扩展游程终点
c) 根据趋势变化更新游程统计
-
计算结果:
a) =
b) =
-
格式化输出结果
#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
- 上传者