如何写出nlogn的算法
  • 板块学术版
  • 楼主Balloonist
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/6/1 19:10
  • 上次更新2023/11/4 22:25:02
查看原帖
如何写出nlogn的算法
131314
Balloonist楼主2021/6/1 19:10

【问题描述】

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;
}
2021/6/1 19:10
加载中...