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; }