zoj 1338 Up and Down Sequences(模拟)
读完题就知道是一道模拟题,但遗憾的是我的模拟题做得并不好,可能是自己的代码能力还不够好吧~~放了一段时间,今天中下决心做了。
刚开始觉得用while一直搜到一个上升或下降序列的最后,但对于像4 4 4 4 这样的序列就不好判断属于上升还是下降序列了,后来看了一下解题报告,明白了~
其实不用管一个上升或下降序列到底用多长,只判断这个数与他前面的数构成上升还是下降就可以了,中间加些判断的标量~
代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<iostream>
5 using namespace std;
6 int main()
7 {
8 int a[102],x,i,j,u,d,t,fu,fd,nu,nd;
9 while(scanf("%d",&x),x)
10 {
11 a[0]=x;
12 j=1;
13 while(scanf("%d",&x),x)
14 a[j++]=x;
15 u=d=nu=nd=t=0;
16 fu=fd=0;
17 for(i=0;i<j-1;i++)
18 {
19 if(a[i]==a[i+1])
20 {
21 if(!fu&&!fd)
22 t++;
23 if(fu)
24 u++;
25 if(fd)
26 d++;
27 }
28 if(a[i]<a[i+1])
29 {
30 fd=0;
31 if(!fu)
32 {
33 fu=1;
34 nu++;
35 }
36 u++;
37 u+=t;
38 t=0;
39 }
40 if(a[i]>a[i+1])
41 {
42 fu=0;
43 if(!fd)
44 {
45 fd=1;
46 nd++;
47 }
48 d++;
49 d+=t;
50 t=0;
51 }
52 }
53 double m,n;
54 if(nu==0)
55 n=0.0;
56 else
57 n=(double)u/nu;
58 if(nd==0)
59 m=0.0;
60 else
61 m=(double)d/nd;
62 printf("Nr values = %d: %.6lf %.6lf\n",j,n,m);
63 }
64 return 0;
65 }