題目描述:
/**
度度熊有一個N個數的數組,他想將數組從小到大 排好序,但是萌萌的度度熊只會下面這個操作:
任取數組中的一個數然后將它放置在數組的最后一個位置。
問最少操作多少次可以使得數組從小到大有序?
輸入描述:
首先輸入一個正整數N,接下來的一行輸入N個整數。(N <= 50, 每個數的絕對值小于等于1000)
輸出描述:
輸出一個整數表示最少的操作次數。
輸入例子1:
4
19 7 8 25
輸出例子1:
2
4
4 3 2 1
*/
思路如下:
第一次把第二小放到最后
第二次把第三小放到最后
以此類推即可
先把Node按照val排序,若val相同按原來輸入數據的idx排序即可
Node{val, idx}用idx模擬移動到最后即可
按val排序后就可順序遍歷模擬依次把逆序的第二小或第三小等移動到隊尾
代碼如下:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define MAX_N 55
using namespace std;
struct Node
{
int val=-1, idx=-1;
Node() {}
Node(int val, int idx)
{
this->val=val;
this->idx=idx;
}
Node(const Node& node)
{
this->val=node.val;
this->idx=node.idx;
}
bool operator < (const Node&node) const
{
return this->val<node.val;
}
};
Node nodes[MAX_N];
int main()
{
int N, idxPtr, cnt=0;
scanf("%d", &N);
idxPtr=N;
for(int i=0; i<N; i++)
{
int idx=i, val;
scanf("%d", &val);
nodes[i]=Node(val, idx);
}
sort(nodes, nodes+N);
for(int i=1; i<N; i++)
{
if(nodes[i-1].idx>nodes[i].idx)
{
nodes[i].idx=idxPtr;
idxPtr++;
cnt++;
}
}
//判斷最大的一個是否需要放到隊尾
if(nodes[N-1].idx==N-1 && idxPtr>N)
{
nodes[N-1].idx=idxPtr;
idxPtr++;
cnt++;
}
printf("%d", cnt);
return 0;
}