标签:
Description
Input
Output
Sample Input
Sample Output
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.
source:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=94498#problem/K
这道题是从后往前做的,我想从前往后,试了确实不行,但是没想通为什么不行
网上的比较好的解释:
1:给出一个数列,每次随机选择一个数,按照冒泡排序的方法去交换,问这种排序最快需要几个回合
思路:如果某个数右边有比他小的数字,那这个数一定要被扔到后边去。所以线性方法统计有多少个这样的数字即可
2:从后往前,存在一组递增子数列则ans加1,因为对于每个这样的递增子序列我们都最少需要选择一次将其排序
/* 问题:给定一个序列,用给定的排序方法把它从小到大排列 给定方法:任意选择一个数,依次找后边比他小的数,并交换这两个数,直到后边没哟比他小的数 称这样的一次操作为一轮 问多少轮操作之后排序成功 分析:从后往前找递增序列数,对于每个递增序列,至少需要移动一次 */ #include <iostream> #include <stdio.h> #define max_num 1000000+10 int num[max_num]; int main() { int t, case_num = 0; scanf("%d", &t); while(t--) { int n, cnt = 0, mi; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &num[i]); mi = num[n-1]; for(int i = n-2; i >= 0; i--) { if(num[i] < mi) mi = num[i]; else cnt++; } printf("Case #%d: %d\n", ++case_num, cnt); } return 0; }
标签:
原文地址:http://www.cnblogs.com/rain-1/p/4885050.html