第3章 排序的使用

2020-03-29  本文已影响0人  得力小泡泡

1、分数线

算法分析

二分

时间复杂度 O(nlogn)

Java 代码

import java.util.Scanner;

public class Main{
    static int N = 100010;
    static int n;
    static int[] a = new int[N];
    static boolean check(int x)
    {
        int res = 0;
        for(int i = 0;i < n;i ++)
            if(a[i] >= x) res ++;
        
        return res >= (n + 1 >> 1);
    }
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        for(int i = 0;i < n;i ++) a[i] = scan.nextInt();
        int l = 0,r = 100;
        while(l < r)
        {
            int mid = l + r + 1 >> 1;
            if(check(mid)) l = mid ;
            else r = mid - 1;
        }
        int cnt = 0;
        for(int i = 0;i < n;i ++) 
            if(a[i] >= l)
                cnt ++;
        System.out.println(l + " " + cnt);
        
    }
}

2、红蓝绿

算法分析

时间复杂度 O(nlogn)

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        char[] temp = scan.next().toCharArray();
        int len = temp.length;
        Arrays.sort(temp,0,len);
        System.out.println(String.valueOf(temp));
        
        int numB = 0;
        int numG = 0;
        int numR = 0;
        for(int i = 0;i < len;i ++) 
        {
            if(temp[i] == 'B') numB ++;
            if(temp[i] == 'G') numG ++;
            if(temp[i] == 'R') numR ++;
        }
        int res = Math.min(numB / 3, numG / 2);
        res = Math.min(res, numR);
        System.out.println(res);
    }
}

3、交叉排序

算法分析

暴力操作

时间复杂度O(nlogn)

Java代码

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    static int N = 100010;
    static int[] a = new int[N];
    static int[] tmp = new int[N];
    public static void main(String[] args) {
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt();
       int l1 = scan.nextInt();
       int r1 = scan.nextInt();
       int l2 = scan.nextInt();
       int r2 = scan.nextInt();
       for(int i = 1;i <= n;i ++) a[i] = scan.nextInt();
       
       Arrays.sort(a,l1,r1 + 1);
       
       for(int i = l2;i <= r2;i ++) tmp[i] = a[i];
       Arrays.sort(tmp,l2,r2 + 1);
       
       for(int i = r2,j = l2;i >= l2;i --,j ++)
            a[j] = tmp[i];
       
       for(int i = 1;i <= n;i ++) 
       {
           if(i != n) System.out.print(a[i] + " ");
           else System.out.println(a[i]);
       }
     }
}

4、前k名的平均数

算法分析

先排序,在找前k名的平均数

时间复杂度 O(nlogn)

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    static int N = 35;
    static int[] a = new int[N];
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        for(int i = 0;i < n;i ++) a[i] = scan.nextInt();
        int k = scan.nextInt();
        Arrays.sort(a,0,n);
        double sum = 0;
        for(int i = n - 1,j = 0;j != k;i --,j ++)
        {
            sum += a[i];
        }
        System.out.printf("%.2f",sum / k);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读