题目描述
小刚雄心勃勃,打算尝试一件似乎永远不会成功的事情:他想给他的整个兔群拍张照片。 为了让照片看起来好看,他想让兔子从矮到高排成一排。不幸的是,就在他让兔子排成一排之后,兔子贝西,总是会制造麻烦,走出了队伍,重新插入到队列的其他位置!
小刚想要交换成对的兔,这样整个兔群就能重新排好队。请帮助他确定为了实现这一目标,他需要在兔子对之间进行的最小交换次数是多少。
输入格式
输入的第一行包含
)N(2≤N≤100). 接下来
N行描述了贝西移动后兔子排成一排时的高度。每只兔子的高度都是
1…1,000,000范围内的整数.兔可能有相同的身高。
输出格式
请输出小刚需要交换兔子对的最小次数,以实现正确的排序。交换不一定需要在排序中涉及相邻的兔子。
样例输入
6
2
4
7
7
9
3
样例输出
3
注意
在这个例子中,贝西显然是身高3的兔子。小刚使用如下所述的三次交换将兔子返回排序顺序:
2 4 7 7 9 3 -原始阵容
2、4、7、7、3、9——交换最后两只兔子
2 4 3 7 7 9 -交换第一个7和3
2 3 4 7 7 9 -交换4和3
#include <bits/stdc++.h>
#define maxn 2000000
using namespace std;
bool flag;
int num,basy,county,h[110],l[110];
int main(){
cin>>num;
h[0] = 0;//虚拟
cin>>h[1];
l[1] = h[1];
int i = 2;
while(i<=num){
cin>>h[i];
if(h[i] == h[i-1]) l[i] = 0;
else l[i] = h[i]; //线搜
i++;
}
h[num+1] = maxn;
for(i = 1;i<=num;i++){
if(h[i]<h[i-1]&&h[i-1]<=h[i+1]){
basy = i;
flag = true;//判为basy后移
break;
}
if(h[i]>h[i+1]&&h[i-1]<=h[i+1]){
basy = i;
flag = false;//判为basy前移
break;
}
}
if(flag)
for(i = 1;i<=basy;i++){
if(l[i] == 0)continue;
else if(l[i]>h[basy]) county++;
}
else
for(i = num;i>=basy;i--){
if(l[i] == 0)continue;
else if(l[i]<h[basy]) county++;
}
cout<<county;
return 0;
}