Problem Description
小明同学最近遇到了这样的一道题目:
给你一个有n个整数的序列A(Ai<=10000),然后从中去掉几个数,组成长度为m的序列B(前后顺序不变),使之满足下列条件:
B 1<B 2<B 3<...<B i>B i+1>B i+2>...>B m
问,至少要去掉几个数,才能满足条件?
例如:
A:4 4 2 6 3 1 5 7
那么当B为2 6 3 1时,能满足条件,且去掉的数字最少。
当n很小的时候,小明很快就算出来了,但是,当n很大的时候,他就纠结了。
给你一个有n个整数的序列A(Ai<=10000),然后从中去掉几个数,组成长度为m的序列B(前后顺序不变),使之满足下列条件:
B 1<B 2<B 3<...<B i>B i+1>B i+2>...>B m
问,至少要去掉几个数,才能满足条件?
例如:
A:4 4 2 6 3 1 5 7
那么当B为2 6 3 1时,能满足条件,且去掉的数字最少。
当n很小的时候,小明很快就算出来了,但是,当n很大的时候,他就纠结了。
Input
输入的第一行为一个正整数T(T<=10),表示接下来有T组测试数据。
每组的第一行为一个正整数n(n<=10000),表示序列A的长度.
接下来有n个数字,表示序列A的各个值.
Output
对于每组数据测试,输出至少要去掉的个数,每组输出占一行.
Sample Input
1 8 4 4 2 6 3 1 5 7
Sample Output
4
输入样例:
5
9
1 2 3 4 5 6 7 8 9
9
1 2 3 4 5 4 3 2 1
8
4 4 2 6 3 1 5 7
6
1 9 8 7 6 5
7
1 2 3 4 5 7 6
输出样例:(为了便于研究,将运算过程输出!)
1 1 1
2 0 2
3 0 3
4 0 4
5 0 5
6 0 6
7 0 7
8 0 8
9 0 9
不存在!
0
1 1 1
2 0 2
3 0 3
4 0 4
5 4 9
1 0 1
1 0 1
1 0 1
1 0 1
0
1 1 1
1 1 2
1 0 1
2 2 4
1 0 1
1 0 1
2 0 2
3 0 3
4
1 1 1
2 4 6
1 0 1
1 0 1
1 0 1
1 0 1
0
1 1 1
2 0 2
3 0 3
4 0 4
5 0 5
6 1 7
1 0 1
0
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 using namespace std; 3 struct P 4 { 5 int l,r,sum; 6 }; 7 int main() 8 { 9 P s[10001]; 10 int n,i,a[10001]; 11 int T; 12 cin>>T; 13 while(T--) 14 { cin>>n; 15 for(i=0;i<n;i++) 16 {scanf("%d",&a[i]); 17 s[i].l=1;s[i].r=0;s[i].sum=1;} 18 19 s[0].l=1;s[0].r=1; 20 int Max=0,j=0,t=0; 21 int flagl=0,flagr=0; 22 for(i=1;i<n;) 23 { 24 if(a[i-1]<a[i]) 25 {s[i].l=s[i].l+s[i-1].l; 26 flagl=1;} 27 j=i;t=0; 28 while(a[i+1]<a[i]&&i!=(n-1)) 29 { 30 s[j].r++; 31 i++; 32 t=1; 33 flagr=1; 34 } 35 s[j].sum=s[j].l+s[j].r; 36 if(s[j].sum>Max) 37 Max=s[j].sum; 38 if(t==0) 39 i++; 40 } 41 for(i=0;i<n;i++) 42 cout<<s[i].l<<" "<<s[i].r<<" "<<s[i].sum<<endl; 43 if(flagl==0||flagr==0) 44 cout<<"不存在!"<<endl; 45 cout<<n-Max<<endl; 46 } 47 48 return 0; 49 }