题解 | #幼儿园分班#

幼儿园分班

https://www.nowcoder.com/practice/e503f18d56754ad9bcf8631adf63721d

解题思路

这是一道分班问题,主要思路如下:

  1. 问题分析:

    • 一个大班要分成两个小班
    • 每个小朋友可能不希望和某些人同班
    • 需要判断是否能满足所有要求
    • 本质是一个二分图染色问题
  2. 解决方案:

    • 使用两个数组记录每个小朋友的分班情况
    • 对于每个请求 ,尝试将 分到不同班
    • 如果发现冲突,则无法满足要求
    • 贪心策略:遇到新的请求就立即分班
  3. 实现细节:

    • 使用数组标记每个小朋友在不同班级的状态
    • 0表示未分配,1表示不能在该班
    • 处理每对不想同班的请求

代码

#include <iostream>
using namespace std;

int main() {
    int first[10000] = {0}, second[10000] = {0};
    int m, n;  // m为总人数,n为请求数
    
    cin >> m >> n;
    for(int i = 0; i < n; i++) {
        int a, b;
        cin >> a >> b;
        
        // 尝试将a分到第一班,b分到第二班
        if(first[a] == 0 && second[b] == 0) {
            first[b] = 1;  // b不能进第一班
            second[a] = 1;  // a不能进第二班
        }
        // 尝试将a分到第二班,b分到第一班
        else if(first[b] == 0 && second[a] == 0) {
            first[a] = 1;
            second[b] = 1;
        }
        else {
            cout << "0" << endl;  // 无法满足要求
            return 0;
        }
    }
    
    cout << "1" << endl;  // 可以满足所有要求
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] first = new int[10000];
        int[] second = new int[10000];
        
        int m = sc.nextInt();  // 总人数
        int n = sc.nextInt();  // 请求数
        
        for(int i = 0; i < n; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            
            // 尝试将a分到第一班,b分到第二班
            if(first[a] == 0 && second[b] == 0) {
                first[b] = 1;  // b不能进第一班
                second[a] = 1;  // a不能进第二班
            }
            // 尝试将a分到第二班,b分到第一班
            else if(first[b] == 0 && second[a] == 0) {
                first[a] = 1;
                second[b] = 1;
            }
            else {
                System.out.println("0");  // 无法满足要求
                return;
            }
        }
        
        System.out.println("1");  // 可以满足所有要求
        sc.close();
    }
}
def can_satisfy_requests(m: int, requests: list) -> bool:
    first = [0] * 10000
    second = [0] * 10000
    
    for a, b in requests:
        # 尝试将a分到第一班,b分到第二班
        if first[a] == 0 and second[b] == 0:
            first[b] = 1  # b不能进第一班
            second[a] = 1  # a不能进第二班
        # 尝试将a分到第二班,b分到第一班
        elif first[b] == 0 and second[a] == 0:
            first[a] = 1
            second[b] = 1
        else:
            return False
    return True

def main():
    m = int(input())
    n = int(input())
    requests = []
    for _ in range(n):
        a, b = map(int, input().split())
        requests.append((a, b))
    
    print("1" if can_satisfy_requests(m, requests) else "0")

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:贪心
  • 时间复杂度: - 为请求数量
  • 空间复杂度: - 为总人数
全部评论

相关推荐

面了这么多场试,总有公司总喜欢压力面一个小时面试+手撕,哪里不会就点哪里,说了不会不会还继续追着问不尊重求职者,稍微有些细节记不清了,就开始怀疑项目真实性以及人格让求职者开摄像头但是自己不开,说话声音还贼小,pardon几次就开始不耐烦的不知道这个算不算,手撕的时候,面试官人跑了。。。最后快结束才来
一纸丿繁华丶:你换位思考一下,自己在职场被领导push麻了,身心俱疲,现在有个机会让你放松一下,体验一把上位者的感觉,还能看着那些高学历人才、未来自己的竞争者,抓耳挠腮、手足无措的样子,没给你当场笑出来就不错了,理解一下面试官吧。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
04-27 08:59
常州大学 Java
牛客139242382号:《两门以上汇编语言》
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务