笔试总结

five选手,只做记录,还请多多指教

先引入大佬的解答

https://blog.csdn.net/qq_22522375/article/details/107771758#comments_12961733

题目:n个朋友,每个人有金币x,有m个房子,每个房子有舒适度和价格,当前仅当这个人金币数大于房子价格时才能购买,每个人至多买一个房子,每个房子最多被一个人买,求最大舒适度;

输入:2 2       //   朋友数:n    房子数:m

    2 2      //    朋友1的金币    朋友2的金币

           2 2      //    房子1的舒适度  房子1的价格

           2 2      //    房子2的舒适度  房子2的价格

输出:4       //    最大舒适度和,即每个人买一个2舒适度的房子

思路:房子按照舒适度从大到小排列,金币从小到大排列,去最小化价格差异买到最大舒适度的房子

import java.util.Arrays;
import java.util.Scanner;
//第一题:n个朋友,每个人有金币x,有m个房子,每个房子有舒适度和价格,当前仅当这个人金币数大于房子价格时才能购买,每个人至多买一个房子,每个房子最多被一个人买,求最大舒适度
public class Main{
    public static void main(String []args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();   //朋友数
        int m = sc.nextInt();   //房数
        int coin[] = new int[n];  //钱
        for (int i = 0; i < n; i++) {
            coin[i] = sc.nextInt();
        }
        int house[][] = new int[m][2]; //第3列用来标记是否卖出
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < 2; j++) {
                house[i][j] = sc.nextInt();
            }
        }
        sortByFitness(house, 0);
        Arrays.sort(coin);
//        for(int i = 0; i < m; i++) {
//            for (int j = 0; j < 2; j++)
//                System.out.print(house[i][j] + " ");
//        }

        int sum = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (coin[j] >= house[i][1]) {
                    sum += house[i][0];
                    coin[j] = -1;
                    break;
                }
            }
        }
        System.out.println(sum);
    }
    //按照第 index列 排序
    private static void sortByFitness(int[][] house,int index) {
        int row = house.length;
        int line = house[0].length;
        for (int i = 0; i < row; i++) {
            for (int j = i; j < row - 1; j++)
                if (house[j][index] < house[j + 1][index]) {
                    int temp[] = new int[line];
                    for (int k = 0; k < line; k++)
                        temp[k] = house[j][k];
                    house[j] = house[j + 1];
                    house[j + 1] = temp;
                }
        }
    }
}

题目:给定一个a-f组成的字符串,对其进行删除,要求所有的a在c和e之前且所有的c在e之前,所有的b在d和f之前且所有的d在f之前,求删除后满足串的最大长度 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String []args){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        ArrayList a1 = new ArrayList();
        ArrayList a2 = new ArrayList();
        for(int i =0;i a) {
        int ant = 1;
        int len = a.size();
        if (len == 0)
            return 0;
        int dp[][] = new int[len][3];
        if (a.get(0) == 0)
            dp[0][0] = 1;
        else if (a.get(0) == 1)
            dp[0][1] = 1;
        else
            dp[0][2] = 1;
        for (int i = 1; i < len; i++) {
            if (a.get(i) == 0)
                dp[i][0] = dp[i - 1][0] + 1;
            else if (a.get(i) == 1)     //1 只能在 0 或者 1 的后面,选一个最长的放入
                dp[i][1] = Math.max(dp[i - 1][0], dp[i - 1][1]) + 1;
            else            //2 只能在 0、1或者2 的后面,选一个最长的放入
                dp[i][2] = Math.max(dp[i - 1][0], Math.max(dp[i - 1][1], dp[i - 1][2])) + 1;
            for (int j = 0; j < 3; j++) {  //统计目前最长是多少
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j]);  //若选择 dp[i-1][j] 相当于删除了 该位置的元素 即不加入
                ant = Math.max(ant, dp[i][j]);
            }
        }
        return ant;
    }
}

 

你可能感兴趣的:(秋招)