列表

详情


OR153. 幼儿园分班

描述

幼儿园一个大班要分成两个小班,有些小朋友不希望自己和其他某几位小朋友同班。园长向大家收集了不希望同班的要求,然后视情况将一个大班的小朋友分成两个班。请你开发一个程序,帮助园长快速判断是否所有小朋友的不同班请求都可以被满足。

输入描述

输入分为三部分,第一个部分是一个 int,代表这个大班里小朋友的总数。第二部分是一个 int,代表园长采集到的小朋友们的请求数。第三部分是小朋友们的请求,每个请求由两个 int 组成,第一个 int 代表提请求的小朋友,第二个 int 代表他不希望同班的另一位小朋友。

输出描述

如果所有小朋友的请求都可以被满足,输出 1,否则输出 0。

示例1

输入:

5
5
1 2
1 3
1 4
1 5
2 3

输出:

0

说明:

总共有 5 位小朋友,总共采集到了 5 个请求。分别是:1 不希望和 2 同班。1 不希望和 3 同班。1 不希望和 4 同班。1 不希望和 5 同班。2 不希望和 3 同班。不能满足所有人的请求,输出 0。

示例2

输入:

5
4
1 2
1 3
1 4
1 5

输出:

1

说明:

总共有 5 位小朋友,总共采集到了 4 个请求。分别是:1 不希望和 2 同班。1 不希望和 3 同班。1 不希望和 4 同班。1 不希望和 5 同班。可以满足所有人的请求,分班方式:1 一个人一班,2、3、4、5 另一班。输出 1。

原站题解

C++14 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2020-07-15

#include <stdio.h>
#include <string.h>
struct node
{
       int x;
       int y;
};
int m;
int flag1=0;
struct node a[100];
int b[101][101];
int c[100];
int a1[101],a2[101];
void init()
{
       int i,j;
       for(i=1;i<=100;i++)
       {
              for(j=1;j<=100;j++)
              {
                     b[i][j]=0;
              }
       }
}
void init2()
{
       int i;
       for(i=1;i<=100;i++)
       {
              a1[i]=0;
              a2[i]=0;
       }
}
void qiongju(int m1)
{
       if(m1==m)
       {
            int i,j;
            int flag=1;
            int n1=1,n2=1;
            init2();
            for(i=1;i<=m;i++)
            {
                   if(c[i-1]==0)
                   {
                          a1[n1]=i;
                          n1++;
                   }
                    if(c[i-1]==1)
                   {
                          a2[n2]=i;
                          n2++;
                   }
            }
            for(i=1;i<=m;i++)
            {
                   for(j=1;j<=m;j++)
                   {
                        if(b[a1[i]][a1[j]]==1||b[a2[i]][a2[j]]==1)
                        {
                               flag=0;
                        }
                   }
            }
             if(flag==1)
             {
              flag1=1;
             }
       }
       else
       {
              c[m1]=0;
              qiongju(m1+1);
              c[m1]=1;
              qiongju(m1+1);
       }
}
int main()
{
       int i,j;
       int n;
       init();
       scanf("%d %d",&m,&n);
       for(i=0;i<n;i++)
       {
              scanf("%d%d",&a[i].x,&a[i].y);
       }
       for(i=1;i<=m;i++)
       {
             for(j=0;j<n;j++)
             {
                    if(a[j].x==i)
                    {
                           b[i][a[j].y]=1;
                    }
             }
       }
       qiongju(0);
       if(flag1==1)
       {
              printf("1\n");
       }
       else
              printf("0\n");
       return 0;
}

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-12-16

#include<iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
    int tol;
    int req_num;
    cin>>tol;
    cin>>req_num;
    vector<vector<int>> require(req_num,vector<int>(2,0));
    for(int i=0;i<req_num;i++){
        cin>>require[i][0]>>require[i][1];
    }
    //数据处理
    int res=1;
     map<int,int> classify;
    for(auto req:require)
    {
        if(classify[req[0]]>0&&classify[req[0]]==classify[req[1]]) 
        {
           res=0;
            break;
        }
        if(classify[req[0]]>0) classify[req[1]]=3-classify[req[0]];
        else if(classify[req[1]]>0) classify[req[0]]=3-classify[req[1]];
        else {
            classify[req[0]]=1;
            classify[req[1]]=2;
        }
    }
    cout<<res<<endl;
    return 0;
}

上一题