UVALive 7068 K.Bro Sorting (应该是水题吧)

Matt's friend K.Bro is an ACMer.
Yesterday, K.Bro learnt an algorithm: Bubble sort. Bubble sort will compare each pair of adjacent
items and swap them if they are in the wrong order. The process repeats until no swap is needed.
Today, K.Bro comes up with a new algorithm and names it K.Bro Sorting.
There are many rounds in K.Bro Sorting. For each round, K.Bro chooses a number, and keeps
swapping it with its next number while the next number is less than it.
For example, if the sequence is “1 4 3 2 5", and K.Bro chooses ”4", he will get “1 3 2 4 5" after
this round. K.Bro Sorting is similar to Bubble sort, but it's a randomized algorithm because K.Bro
will choose a random number at the beginning of each round. K.Bro wants to know that, for a given
sequence, how many rounds are needed to sort this sequence in the best situation. In other words, you
should answer the minimal number of rounds needed to sort the sequence into ascending order. To
simplify the problem, K.Bro promises that the sequence is a permutation of 1, 2, . . . , N.
Input
The rst line contains only one integer T (T<= 200), which indicates the number of test cases. For each
test case, the rst line contains an integer N (1<= N <=106 ).
The second line contains N integers ai (1 <=ai<= N), denoting the sequence K.Bro gives you.
The sum of N in all test cases would not exceed 3e6 .
Output
For each test case, output a single line `Case #x: y', where x is the case number (starting from 1), y
is the minimal number of rounds needed to sort the sequence.
Hint:
In the second sample, we choose "5" so that after the rst round, sequence becomes "1 2 3 4 5",
and the algorithm completes.
Sample Input
2
5
5 4 3 2 1
5
5 1 2 3 4
Sample Output
Case #1: 4
Case #2: 1

题意

输入T组测试数据,N表示每组数据有N个数,要求输出将这N个数从输入时的排列通过冒泡排序变成升序排列需要移动的次数。

思路

先将最小值min设置为最后一个数,从倒数第二个数往前遍历碰到比min大的说明要移动一次,即ans++,碰到比它小的把min设置成小的的数继续往前遍历即可。

AC代码

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <cmath>
#include <map>
#include <list> 
#define ll long long
using namespace std;

const int mod = 1e9+7;
const int maxn = 1e6+5;
int a[maxn];
int main()
{
	int T,ncase = 0,n,Min;
	scanf("%d",&T);
	while (T--){
		int ans = 0;	
		scanf("%d",&n);
		for (int i = 0; i<n; i++){//读入数据
			scanf("%d",&a[i]);
		}
		Min = a[n-1];//最小值设置成最后一个数
		for (int i = n-2; i>=0; i--){//从倒数第二个数开始往前遍历
			if (a[i]>Min){//碰到比它大的说明要移动一次
				ans++;
			}
			else Min = a[i];//碰到比它小的就把最小值更新为小的数
		}
		printf("Case #%d: %d\n",++ncase,ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Gamer_Lee/article/details/81710746
今日推荐