打赏

京东:笔试题(合唱队找剩余的最小值,考场安排搬出的人数尽可能少)

1. 合唱队

题目 大意: 将数组分成若干个数组 ,子数组内部从小到大排序,使所有子数组整体按非递减顺序,求子数组最大数量;

输入

4

2 1 3 2 

输出

2

输入

10
69 230 77 650 440 270 750 760 990 880

输出

6

 

代码:

import java.util.Scanner;
public class B9 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        String[] str = sc.nextLine().split(" ");
        long[] val = new long[n];
        for (int i = 0; i < n; i++) {
            val[i] = Long.valueOf(str[i]);
        }
        int[] positions = new int[n];
        int count = 0;
        int index = 0;
        while(index< n-1){
            long min = Long.MAX_VALUE;
            int i = index;
            for (; i < n; i++) {
                if(min> val[i]){
                    min = val[i];
                    positions[count]= i;
                }
            }
            if(positions[count]==index){
                index = index+1;
            }else{
                index = positions[count]+1;
            }
            count++;
        }
        System.out.println(count);
    }
}

2. 考场安排

考场不允许两个很熟的异性朋友存在,学习希望通过搬出一部分学生来解决问题,问

第二题,输入n和m,然后输入的是m行对应朋友关系,希望一个教师中容下的学生尽可能多,搬出学生尽可能少,求搬出人数最少且字典序最小的方案

输入:
2 2
1 3
1 4
输出:
1
1

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class B8 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m  = sc.nextInt();
        sc.nextLine();
        int len = 2*n +1;
        int[] du = new int[len];
        int count = m;
        boolean[][] relation = new boolean[len][len];
        for (int i = 0; i < m; i++) {
            String[] str = sc.nextLine().split(" ");
            int val1 = Integer.valueOf(str[0]);
            int val2 = Integer.valueOf(str[1]);
            int boy = Math.min(val1, val2);
            int girl = Math.max(val1, val2);
            relation[boy][girl] = true;
            du[boy]++;
            du[girl]++;
        }
        LinkedList<Integer> result = new LinkedList<>();
        while(count>0){
            int[] tempdu = Arrays.copyOf(du,len);
            Arrays.sort(tempdu);
            int maxdu = tempdu[len-1];
            if(maxdu==0){
                break;
            }
            for (int i = 1; i < len; i++) {
                if(du[i]==maxdu){
                    for (int j = n; j < len; j++) {
                        if(relation[i][j]){
                            relation[i][j]=false;
                            du[i]--;
                            du[j]--;
                            count--;
                        }
                    }
                    result.add(i);
                }
            }
        }
        int alen = result.size();
        System.out.println(alen);
        for (int i = 0; i < alen; i++) {
            System.out.print(result.get(i));
            if(i==alen-1){
                System.out.print(" ");
            }
        }
    }
}

 

posted @ 2019-08-24 21:49  海米傻傻  阅读(480)  评论(2编辑  收藏  举报