Description
给定一串整数数列,求出所有的递增和递减子序列的数目,如数列7,2,6,9,8,3,5,2,1可分为(7,2),(2,6,9),(9,8,3),(3,5),(5,2,1)5个子序列,答案就是5,我们称2,9,3,5为转折元素。Input
输入第一行为n(n <= 100);第二行为n个数;Output
输出所有的递增和递减子序列的数目Sample Input
9 7 2 6 9 8 3 5 2 1Sample Output
5题目分析
一开始尝试直接计算递增子序列和递减子序列数目,但一直调试不对。 再次分析题目发现:本题中的子序列,是连续的。为此,我们只需算出递增递减的转折次数+1即可。 即有: walk*(a[i]-a[i-1])>0代表未发生转折 walk*(a[i]-a[i-1])<0代表发生转折 walk为当前点的前两项之差 #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); }