Description
每次选择序列最左边的数,然后将其插入到序列中任意一个位置。求至少需要重复进行多少次上述操作,才可以将序列变为一个递增序列。
Input
输入的第一行包含一个整数T (T > 0),表示一共有T组测试数据.对于每组测试数据,第一行包含一个整数n (1 ≤ n ≤ 105),表示这个序列中一共有n个整数。第二行包含n个各不相同的整数(这些整数均在[1, 109]范围内),依次描述了这个序列中的各个数。Output
对于每组测试数据,输出一个整数,表示至少需要重复进行多少次上述操作,才可以将这个序列变为一个递增序列。
Sample Input
3 3 1 2 3 3 1 3 2 5 1 5 4 3 2
从后往前扫描,若扫描过的值已经按递减(即从前往后递增)有序则接着扫描,每两个值比较大小,直到出现前一元素值大于后一元素,则前一元素需要移动,Sample Output
0 2 4
题中又说每次从最左侧移动,所以这一元素包括它本身之前的所有元素都需要移动,那么直接跳出输出此时数组下标即可
//AC.#include <iostream> #include <cstdio> #include <cstring> using namespace std; long long int a[100005]; int main() { int t; scanf("%d",&t); while(t--) { int n; memset(a,0,sizeof(a)); scanf("%d",&n); int m=0,k=n-1; while(m<n) { scanf("%lld",a+(m++)); } while(a[m-1]>a[m-2]&&(m-2)>-1) { m--; //当a[m-1]〉a[m-2]说明a[m-2]不需要移动,反之包括a[m-2]在内及之前的所有元素都需要移动,共m-2+1个 } printf("%d\n",m-1); } return 0; }
插入排序
最新推荐文章于 2020-02-26 11:32:35 发布