码迷,mamicode.com
首页 > 其他好文 > 详细

1011 K.Bro Sorting

时间:2014-11-29 14:23:20      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   sp   for   on   div   

·2号题

·举个例子来进行说明:  5 2 3 1 7 4 6

思路:

  维护一个最小值t,初始为最后一个数,这里为6;

  我们从后向前考虑,先看末尾6,其前面为4,不需要动,更改t为更小的4;

  再向前,为7,此时7>t,那么对于7来说,其肯定是需要动的,令num++;

  再向前,1<t,令t=1;

  再向前,因为t为1,所有值都会>t,对于3、2、5来说,都需要进行num++。

  这里num加了4次,结果为4.

解释:

  因为题目中交换数字有一个特点,就是选择一个数字x,从前向后进行,一直进行到x<其后面的数字;

  那么对于每一个数字来说,只要其后面存在比它小的数字,其都要进行一次移位!

 (这句话的意思就是从当前数字之后的所有数字中找到最小值,与其比较;我们从后向前进行,可以对最小值进行维护,大大降低时间复杂度),

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <string.h>
 6 #include <math.h>
 7 #include <queue>
 8 #include <stack>
 9 #include <stdlib.h>
10 #include <map>
11 using namespace std;
12 
13 #define LL long long 
14 #define sf(a) scanf("%d",&(a));
15 #define inf 2e9
16 #define INF 2147483647
17 #define N 25
18 #define PI 3.141592653
19 #define EPS 1e-8
20 
21  int f[N];
22  int main(){
23      int T,n;int k=1;
24      scanf("%d",&T);
25      while(T--){
26          scanf("%d",&n);
27          for(int i=0;i<n;i++){
28              scanf("%d",&f[i]);
29          }
30          int num=0;int t = f[n-1];
31          for(int i=n-2;i>=0;i--)
32              if(f[i]>t) num++;
33              else t = f[i];
34          printf("Case #%d: ",k++);
35          printf("%d\n",num);
36      }
37      return 0;
38  }

 

1011 K.Bro Sorting

标签:style   blog   io   color   os   sp   for   on   div   

原文地址:http://www.cnblogs.com/songacm/p/4130588.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!