AtCoder Beginner Contest 006 D - トランプ挿入ソート

原题链接:D - トランプ挿入ソート (atcoder.jp)

题目大意:给一个长度为n的数组,让这个数组从小到大排序的最小操作数是多少?操作是值将一个数移到其他位置。

思路:如何最小的操作?在给出的数组中,虽然是无序的数组,但是各个元素之间存在着相对的大小,这些数并不需要动,可以将其他数删除,然后与这些数比较并放入对应位置即可。那么如何求出最多数的相对位置?也就是求最长的上升子序列。那么这题就非常简单了。

#pragma GCC optimize(2)
#include
#define endl '\n' 
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair pii;
const int N=1e6+10,mod=10007;
ll op[N];
int main()
{
    ios::sync_with_stdio(NULL);
	cin.tie(0),cout.tie(0);
	ll n,cnt=1;cin>>n;
	for(int i=1;i<=n;i++)
	{
	    ll a;cin>>a;
		if(a>op[cnt-1])
		{
			op[cnt++]=a;
		}
		else
		{
			ll l=0,r=cnt;
			while(l+1>1;
				if(op[mid]>=a)r=mid;
				else l=mid;
			}
			if(op[l]>=a)r=l;
			op[r]=a;
			if(r==cnt)cnt++;
		}
	}
	cout<

你可能感兴趣的:(算法,数据结构,c++)