ZOJ Problem Set - 4104 Sequence in the Pocket(排序思维题)

Sequence in the Pocket
Time Limit: 2 Seconds Memory Limit: 65536 KB
DreamGrid has just found an integer sequence in his right pocket. As DreamGrid is bored, he decides to play with the sequence. He can perform the following operation any number of times (including zero time): select an element and move it to the beginning of the sequence.

What’s the minimum number of operations needed to make the sequence non-decreasing?

Input
There are multiple test cases. The first line of the input contains an integer , indicating the number of test cases. For each test case:

The first line contains an integer (), indicating the length of the sequence.

The second line contains integers (), indicating the given sequence.

It’s guaranteed that the sum of of all test cases will not exceed .

Output
For each test case output one line containing one integer, indicating the answer.

Sample Input
2
4
1 3 2 4
5
2 3 3 5 5
Sample Output
2
0
Hint
For the first sample test case, move the 3rd element to the front (so the sequence become {2, 1, 3, 4}), then move the 2nd element to the front (so the sequence become {1, 2, 3, 4}). Now the sequence is non-decreasing.

For the second sample test case, as the sequence is already sorted, no operation is needed.

**

给定n个数,每次选一个数放到最前面,最少选多少次可以使得这个数组从小到大排序。
1 3 2 4
1 2 3 4
先排最大的,再排次大的,以此类推。
从后往前选,如果当前最后一个数字是当前最大的,说明已经匹配不用选该数字,继续往前选 同时由于这个数字已经匹配,当前最大数字也往前递推变次大;如果当前最后一个不是最大的, 则选取该数字到最前面,当前最大数字不变,继续往前选

**。

/*
  给定n个数,每次选一个数放到最前面,最少选多少次可以使得这个数组从小到大排序。
  1 3 2 4
  1 2 3 4
  先排最大的,再排次大的,以此类推。
  
  从后往前选,如果当前最后一个数字是当前最大的,说明已经匹配不用选该数字,继续往前选
  同时由于这个数字已经匹配,当前最大数字也往前递推变次大;如果当前最后一个不是最大的,
  则选取该数字到最前面,当前最大数字不变,继续往前选。
  
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int T,n,a[maxn],b[maxn];
int main()
{
    cin >> T;
    while(T--)
    {
        cin >> n;
        for(int i=1;i<=n;i++)
        {
            cin >> a[i];
            b[i]=a[i];
        }
        sort(b+1,b+1+n);
        int cur=n,ans=0;
        for(int i=n;i>=1;i--)
        {
            if(a[i]==b[cur])
                cur--;
            else
                ans++;
        }
        cout << ans << endl;

    }


    return 0;
}

题意:

你个数自,操作:每一个数字只能移到第一个位置,问最少操作的次数

分析:

这题以前做过:https://blog.csdn.net/sdz20172133/article/details/86581609,但是当时的想法只能对于1~n的全排列,这个题就gg了,本来以为离散化就ok了,2 3 2 3样例卡死,最后,队友想了一个方法才过的;

正解:

首先我们发现越大的数越不要动,当前最大的数可以不动,把他们中间的数必须移动,而把这些越大的数到前面只会浪费次数。

我们开一个b数组对数组进行排序,对于最大的数我们是可以不动,紧接次大。。。。。

猜你喜欢

转载自blog.csdn.net/w1304636468/article/details/89810209
今日推荐