JD 8.24 笔试

考试安排:下来重新做了一遍
题目描述:
某校在积极推行无人监考制度,但是总有学生是不自觉的,
如果将两个很熟的异性朋友放在同一个考场里,他们就会
交流甚至作弊。因此一个考场中不能允许两个很熟的异性
朋友存在,学校希望通过搬出一部分学生的方法来改善这
一问题。
但是又因为教室数量有限,因此希望一个教室中容下的学
生尽可能多,即需要搬出教室的学生数量尽可能少,请你
输出搬出教室人数最少,且字典序最小的方案。
输入
输入第一行有两个整数n和m,分别表示有n个男生和n个
女生,有m个朋友关系。
(1<=n<=500,1<=m<=100000)
接下来m行,每行有两个整数,x和y,表示第x号男生
和第y号女生是朋友。男生的编号均为[1,n],女生的
编号为[n+1,2n]。
输出
输出第一行包含一个整数a,表示最少需要搬出教室的人数。
输出第二行有a个整数,即a个需要搬出教室的人的编号,
要求人数最少,且字典序最小。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Solution2 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){

            int n = in.nextInt();

            int m = in.nextInt();

            boolean[][] relationShips = new boolean[2*n+1][2*n+1];
            Cell[] cells = new Cell[2*n+1];
            PriorityQueue maxHeap = new PriorityQueue(new Comparator() {
                @Override
                public int compare(Cell o1, Cell o2) {
                    if(o1.count==o2.count){
                        return o1.no - o2.no;
                    }
                    return o2.count - o1.count;
                }
            });
            int count = 0;
            for (int i = 1; i <= m; i++) {

                int x = in.nextInt();

                int y = in.nextInt();

                relationShips[x][y] = true;
                relationShips[y][x] = true;

                count = count + 2;

                if(cells[x]==null){
                    cells[x] = new Cell(x);
                    cells[x].count = 1;
                }else{
                    cells[x].count++;
                }
                if(cells[y]==null){
                    cells[y] = new Cell(y);
                    cells[y].count = 1;
                }else{
                    cells[y].count++;
                }
            }

            for (int i = 1; i < cells.length; i++) {
                if(cells[i]!=null&&cells[i].count!=0)
                maxHeap.offer(cells[i]);
            }
            ArrayList ans = new ArrayList();
            while (count>0){
                Cell cell = maxHeap.poll();
                if(cell==null || cell.count==0) continue;

                count -= cell.count;

                int no = cell.no;
                for (int i = 1; i <= 2*n; i++) {
                    if(relationShips[no][i]){
                        relationShips[no][i]=false;
                        relationShips[i][no]=false;
                        cells[i].count--;
                        count--;
                    }
                }
                ans.add(no);

            }
            int num = ans.size();
            System.out.println(num);
            int[] out = new int[num];
            for (int i = 0; i < ans.size(); i++) {
                out[i] = ans.get(i);
            }
            for (int i = 0; i < out.length; i++) {
                if(i==0){
                    System.out.print(out[i]);
                }else {
                    System.out.print(" " + out[i]);
                }
            }
        }
    }
}
class Cell{
    int no;
    int count;
    Cell(int no){
        this.no = no;
        this.count = 0;
    }
}
#笔试题目##春招##校招#
全部评论
ac了吗?什么思路?
点赞 回复 分享
发布于 2019-08-25 10:00

相关推荐

spiritecs:没实习非985211硕很难很难,只能说祝早日成功
点赞 评论 收藏
分享
01-07 15:50
四川大学 Java
看日出看日落:好好背八股,做算法。我身边跟你bg差不多的基本都大厂暑期
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
02-12 10:05
小米集团 算法工程师 28.0k*15.0
泡沫灬一触即破:楼上那个看来是看人拿高薪,自己又不如意搁这泄愤呢是吧,看你过往评论很难不怀疑你的精神状态
点赞 评论 收藏
分享
评论
3
32
分享

创作者周榜

更多
牛客网
牛客企业服务