题目描述
给定一串整数数列,求出所有的递增和递减子序列的数目。
具体如下图:
逐个元素遍历,根据递增递减关系,逐个判断
#include <stdio.h>
int main()
{
int n,i,m,p,count=0,up=-1;
scanf("%d",&n);
scanf("%d",&p);
for(i=1;i<n;i++)
{
scanf("%d",&m);
if(m>p)
{
if(up != 1)
{
count++;
up = 1;
}
}
else
{
if(up != 0)
{
count++;
up = 0;
}
}
p = m;
}
printf("%d",count);
}
因为n>=2,所以先读取前两个数,根据两个数的大小得到当前子序列是升序还是降序,然后继续读取后面的数字,判断两个相邻数字的大小,根据当前升序或降序以及当前两个相邻数字的大小关系决定是否改变序列类型(升序变降序或者降序变升序,子序列数量+1)。
运行结果如下:
C语言代码:
#include <stdio.h>
int main()
{
int n, i;
int pre, cur; //前一个数、当前数字
int flag; //升序或者降序标志,0表示升序,1表示降序
int nmb = 0; //升序或降序子序列个数
scanf("%d", &n); //读取数字的个数
scanf("%d", &pre); //读取第一个数字
scanf("%d", &cur); //读取第二个数字
//判断当前序列类型:升序还是降序
if (cur > pre)
flag = 0; //升序
else
flag = 1; //降序
nmb = 1; //子序列个数置1
pre = cur;//当前数变为前一个数字,并开始读取后面的数字
for (i = 2; i < n; i++) //从第三个数字开始读取
{
scanf("%d", &cur);
if (flag == 0) //之前是升序
{
if (cur > pre) //仍然是升序
pre = cur;
else
{
nmb++; //子序列数+1
pre = cur;
flag = 1; //变为降序
}
}
else //之前是降序
{
if (cur < pre) //仍然是降序
pre = cur;
else
{
nmb++;
pre = cur;
flag = 0; //变为升序
}
}
}
printf("%d", nmb);
return 0;
}
C++代码:
#include <iostream>
using namespace std;
int main()
{
int n, i;
int pre, cur; //前一个数、当前数字
int flag; //升序或者降序标志,0表示升序,1表示降序
int nmb = 0; //升序或降序子序列个数
cin >> n; //读取数字的个数
cin >> pre; //读取第一个数字
cin >> cur; //读取第二个数字
//判断当前序列类型:升序还是降序
if (cur > pre)
flag = 0; //升序
else
flag = 1; //降序
nmb = 1; //子序列个数置1
pre = cur; //当前数变为前一个数字,并开始读取后面的数字
for (i = 2; i < n; i++) //从第三个数字开始读取
{
cin >> cur;
if (flag == 0) //之前是升序
{
if (cur > pre) //仍然是升序
pre = cur;
else
{
nmb++; //子序列数+1
pre = cur;
flag = 1; //变为降序
}
}
else //之前是降序
{
if (cur < pre) //仍然是降序
pre = cur;
else
{
nmb++;
pre = cur;
flag = 0; //变为升序
}
}
}
cout << nmb;
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
int a[101];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int up=0,down=0,walk=0;
walk=a[1]-a[0];
if (walk>0)
up +=1;
else down +=1;
for (int i=2;i<n;i++)
{
if (walk*(a[i]-a[i-1])<0)
{
walk=a[i]-a[i-1];
if (walk>0)
up +=1;
else down +=1;
}
}
printf("%d",up+down);
}