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

本文介绍了一种新颖的排序算法-K.BroSorting,由Matt的朋友K.Bro发明。该算法通过选择序列中的一个随机数并持续交换它与较小的相邻数,直到序列变为升序。文章探讨了在最佳情况下,将特定序列排序所需的最少轮次。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值