题意:
定义一种排序算法,每一轮可以随机找一个数,把这个数与后面的比这个数小的交换,一直往后判断,直到后面没有比这个数小的,这样称为一轮
现在给定一个长度为n的序列,要你求,至少要经过多少轮,可以使这个序列成为有序的。
分析:
经过观察可以发现, 由于只能跟后面的数进行比较, 所以我只要统计每个数后面是否存在比它小的数就好了
然后只要从后往前扫一遍,每次更新当前最小值和答案就可以了
代码:
//
// Created by TaoSama on 2015-10-11
// Copyright (c) 2015 TaoSama. All rights reserved.
//
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <set>
#include <vector>
using namespace std;
#define pr(x) cout << #x << " = " << x << " "
#define prln(x) cout << #x << " = " << x << endl
const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
int n, a[N];
int main() {
#ifdef LOCAL
freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);
// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);
#endif
ios_base::sync_with_stdio(0);
int t; scanf("%d", &t);
int kase = 0;
while(t--) {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", a + i);
int minv = a[n], ans = 0;
for(int i = n - 1; i > 0; --i) {
if(a[i] > minv) ++ans;
minv = min(minv, a[i]);
}
printf("Case #%d: %d\n", ++kase, ans);
}
return 0;
}