有nn个同学排成一排。
h_1, h_2, h_3, ..., h_n 代表这些同学的高度,两两不同。
每次 Lecoww 可以选择两个相邻的同学,将他们两人的位置交换,这样的交换可以进行无数次(确信。
你的任务是帮助 Lecoww 用最少次数的交换,使这些同学的身高从左到右的高度递增。
Input 共两行
第一行一个数nn 第二行nn个数h_1, h_2, h_3, ..., h_n,代表这些同学的高度
Output
一个数,表示最少的交换次数。
Sample Input 1
5 3 5 4 1 2
Sample Output 1
5
Hint
对于样例:
第1次,交换第4和第5个同学,排序后为3,5,4,2,1
第2次,交换第3和第4个同学,排序后为3,5,2,4,1
第3次,交换第1和第2个同学,排序后为5,3,2,4,1
第4次,交换第2和第3个同学,排序后为5,2,3,4,1
第5次,交换第1和第5个同学,排序后为1,2,3,4,5
可以证明,没有方法比这更少。
对于100%100的数据,满足
1 <= n <= 3 x 10^5
1 <= h_i <= n
保证h_i 互不相同。
评分标准:
第 1 - 8个点 : 共8分,n <= 4 第 9 - 16个点 : 共8分,n <= 8
第 17 - 20个点 : 共16分,n <= 100
第 21 - 24个点 : 共8分,n <= 300
第 25 - 28个点 : 共8分,n <= 700
第 29 - 32个点 : 共8分,n <= 2000
第 33 - 36个点 : 共8分,n <= 6000
第 37 - 40个点 : 共16分,n <= 60000
第 41 - 45个点 : 共25分,n <= 300000
我的想法是模拟冒泡:但只得了42分
我的代码:
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize(2)
using namespace std;
#define ll long long
ll b1,b2,ma,mi=1000000,ans=0,ans1=0;
ll n,a[300001]={0},b[300001],last1,last2,sot,sot2;
bool bj,bjj;
inline void f1(){
for(int i=1;i<=n;i++){
if(b[i]<mi){
mi=b[i];
b2=i;
}
}
}
inline void f2(){
for(int i=1;i<=n;i++){
if(b[i]>ma){
ma=b[i];
b1=i;
}
}
}
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
sot=n;
sot2=n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
for(int i=n;i>=1;i--){
for(int j=2;j<=sot;j++){
if(a[j-1]>a[j]){
bj=1;
swap(a[j-1],a[j]);
last1=j;
ans++;
}
}
sot=last1;
if(bj==0)
break;
}
f1();
f2();
if(n-b1>=b2-1){
swap(b[n],b[b1]);
ans1++;
}
else{
swap(b[1],b[b2]);
ans1++;
}
for(int i=n;i>=1;i--){
for(int j=2;j<=sot2;j++){
if(b[j-1]>b[j]){
bjj=1;
swap(b[j-1],b[j]);
ans1++;
last2=j;
}
}
sot=last2;
if(bjj==0)
break;
}
if(ans1<=ans)
cout<<ans1;
else
cout<<ans;
return 0;
}
我太弱了
求大佬指点