
作者共發了10篇帖子。
![]()  | 
      
        
        ![]()  | 
    
![]()  | 
      
        
         #include <stdio.h> 
      #include <stdlib.h> typedef struct _CHILD { int height; int unhappiness; int increment; } CHILD; int main(void) { int n, i, j, count; CHILD *children; CHILD child; scanf("%d", &n); children = (CHILD *)malloc(n * sizeof(CHILD)); for (i = 0; i < n; i++) { scanf("%d", &children[i].height); children[i].unhappiness = 0; children[i].increment = 1; } for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1 - i; j++) { if (children[j].height > children[j + 1].height) { children[j].unhappiness += children[j].increment; children[j].increment++; children[j + 1].unhappiness += children[j + 1].increment; children[j + 1].increment++; child = children[j]; children[j] = children[j + 1]; children[j + 1] = child; } } } count = 0; for (i = 0; i < n; i++) { count += children[i].unhappiness; } printf("%d\n", count); free(children); return 0; }  | 
    
![]()  | 
      
        
         樓上的代碼是直接採用的冒泡排序法。 
      但是只能過30%的數據: ![]() 得分為30分(總比零分好)  | 
    
![]()  | 
      
        
         如果要完全正確,必須要用到線性代數裏面的逆序的知識。 
       | 
    
![]()  | 
      
        
         也就是說,C語言課程里所學的所有的排序算法都不能用 
       | 
    
![]()  | 
      
        
         不過可以直接用冒泡排序法,先得30分走人,總比0分好 
       | 
    
![]()  | 
      
        
        回復5樓 @巨大八爪鱼 的內容:如果要完全正確,必須要用到線性代數裏面的逆序的知識。 
        n級排列中的最小逆序數。。。。 
       | 
    
![]()  | 
      
        
         把int改long long後,得分增加了20: 
      ![]() 【代碼】 #include <stdio.h> #include <stdlib.h> typedef struct _CHILD { int height; long long unhappiness; long long increment; } CHILD; int main(void) { int n, i, j; long long count; CHILD *children; CHILD child; scanf("%d", &n); children = (CHILD *)malloc(n * sizeof(CHILD)); for (i = 0; i < n; i++) { scanf("%d", &children[i].height); children[i].unhappiness = 0; children[i].increment = 1; } for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1 - i; j++) { if (children[j].height > children[j + 1].height) { children[j].unhappiness += children[j].increment; children[j].increment++; children[j + 1].unhappiness += children[j + 1].increment; children[j + 1].increment++; child = children[j]; children[j] = children[j + 1]; children[j + 1] = child; } } } count = 0; for (i = 0; i < n; i++) { count += children[i].unhappiness; } printf("%I64d\n", count); free(children); return 0; }  | 
    
![]()  | 
      
        
         也就是說,用64位整型變量+上學期學的冒泡排序法,就能搞定一半的分數。 
       | 
    
![]()  | 
      
        
         由於每次只能交換位置相鄰的兩個小朋友,所以不能使用選擇排序法和插入排序法。 
       |