【问题描述】
n 张带有数字的卡片放在桌上,摆成一排,卡片上的数从左到右依次是 a1,a2,...,an。
现在小 H 想给这排卡片排个序。显然,如果仅仅是排成递增或递减序列,那对你来说实
在太小儿科了。那如果是排成先增后减的序列呢?好吧,还是很简单。
你每次可以交换相邻的两张卡片,最终得到的序列需要满足以下要求:存在 k(1≤k≤n),当 i<k 时,a i ≤a i+1 ,当 i≥k 时,a i ≥a i+1 。(1≤i≤n-1) 求最少交换次数。
【输入格式】
第一行一个正整数 n,表示卡片个数。 第二行 n 个正整数 a1,a2,...,an。
【输出格式】
一行一个整数,表示最少交换次数。
还错了
#include<bits/stdc++.h>
using namespace std;
int h[100009];//[100009];
int t[100009];//[100009];
int n,m,ans1[100009],ans2[100009];
int up[100009],down[100009];
int maxi=INT_MAX;
int oi=0;
int mini=-1;
int pi=0;
int ans=0;
int main()
{
freopen("updown.in","r",stdin);
freopen("updown.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>h[i];
t[i]=h[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j>=2;j--)
{
if(h[j]<h[j-1])
{
swap(h[j-1],h[j]);
ans++;
}
}
ans1[i]=ans;
}
ans=0;
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{
if(t[j-1]<t[j])
{
swap(t[j-1],t[j]);
ans++;
}
}
ans2[i]=ans;
}
for(int i=1;i<=n;i++)
{
maxi=min(maxi,ans1[i]+ans2[i+1]);
}
cout<<maxi;
return 0;
}