第十三届校赛之上升序列(1228)

来源:互联网 发布:python prime number 编辑:程序博客网 时间:2024/05/19 13:21

告诉你一个长度为n的数列A,我们需要找到A的某个区间[L,R]的子序列B;并且子序列B满足条件当:[L,R]的元素升序排序后,A能成为一个升序排列的数组。求解这样的子序列B的最短长度为多少?
Description
多组测试数据,每组测试数据仅含两行。 
第一行仅含一个整数n(0<n<1000000)
第二行含n个整数表示数列A的元素(Ai在int范围内)。
Input
对于每组测试数据,输出满足条件的子序列B的最短长度。
Output
1
2
3
4
5
6
3
1 2 3
4
1 3 2 4
6
1 2 5 4 5 7
Sample Input
1
2
3
0
2
2
这题原来这么简单,当时居然没做出来,
/* * 题解: 用两个数组来记录元素,再把其中一个数组从小到大排序, 最后用for循环从前后两端找不同的元素找到就break,并 记录其break时的下标i和j最后的答案就是j-i+1。*/#include<stdio.h>#include<iostream>#include<algorithm>#include<math.h>#include<stdlib.h>#include<string.h>using namespace std;int num[1000000];int tep[1000000];int main(){int n;while (cin >> n){for (int i = 0; i < n; i++){scanf("%d", &num[i]);tep[i] = num[i];}sort(num, num + n);int i, j;for (i = 0; i < n; i++){if (num[i] != tep[i]){break;}}for (j = n - 1; j >= i; j--){if (num[j] != tep[j]){break;}}cout << j - i + 1 << "\r\n";}return 0;}

唉,果然还是太菜了(+﹏+)




原创粉丝点击