hdu-5500 Reorder the Books

Reorder the Books
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1834 Accepted Submission(s): 949

Problem Description
dxy has a collection of a series of books called “The Stories of SDOI”,There are n(n≤19) books in this series.Every book has a number from 1 to n.

dxy puts these books in a book stack with the order of their numbers increasing from top to bottom. dxy takes great care of these books and no one is allowed to touch them.

One day Evensgn visited dxy’s home, because dxy was dating with his girlfriend, dxy let Evensgn stay at home himself. Evensgn was curious about this series of books.So he took a look at them. He found out there was a story about “Little E&Little Q”. While losing himself in the story,he disrupted the order of the books.

Knowing that dxy would be back soon,Evensgn needed to get the books ordered again.But because the books were too heavy.The only thing Evensgn could do was to take out a book from the book stack and and put it at the stack top.

Give you the order of the disordered books.Could you calculate the minimum steps Evensgn would use to reorder the books? If you could solve the problem for him,he will give you a signed book “The Stories of SDOI 9: The Story of Little E” as a gift.

Input
There are several testcases.

There is an positive integer T(T≤30) in the first line standing for the number of testcases.

For each testcase, there is an positive integer n in the first line standing for the number of books in this series.

Followed n positive integers separated by space standing for the order of the disordered books,the ith integer stands for the ith book’s number(from top to bottom).

Hint:
For the first testcase:Moving in the order of book3,book2,book1 ,(4,1,2,3)→(3,4,1,2)→(2,3,4,1)→(1,2,3,4),and this is the best way to reorder the books.
For the second testcase:It’s already ordered so there is no operation needed.

Output
For each testcase,output one line for an integer standing for the minimum steps Evensgn would use to reorder the books.

Sample Input
2
4
4 1 2 3
5
1 2 3 4 5

Sample Output
3
0

Source
BestCoder Round #59 (div.1)

**

给定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/89810220