问题 H: ACM实验室招新啦!!
时间限制: 1 Sec
内存限制: 128 MB
提交: 210
解决: 56
[ 提交][ 状态][ 讨论版]
题目描述
http://125.221.232.253/JudgeOnline/problem.php?cid=1046&pid=7
湖南科技大学的ACM实验室自2011年以来,逐渐步入正规,但现在实验室的ACMer全部都来自计算机学院,这给我们的发展带来瓶颈,因此我们决定面向全校招募一些精通算法、数学和英语的人才。
算法可以细分为穷举、递推、搜索、动态规划等;数学可以细分为数论、组合数学等;英语细分为词汇量和快速阅读能力等。这里为了简化问题,我们把这些细分的能力都称为算法能力,并记作1、2、3……m。
通过我们的广泛宣传,全校同学积极响应,特别是本部各非计算机学院和潇湘学院的同学也积极报名,这让我们非常高兴,也让我们充满了无限遐想:省赛不算什么,未来目标直指ACM亚洲区预选赛,ACM全球总决赛。当然,比赛只是证明能力的一种方式,我们真正的目的在于和全国的ACMer广泛交流,不断提升自己的能力。杭电OJ每天数以万计的程序提交说明什么,ACM圈子太火爆了。
现在有很多同学都想加入我们成为一个真正的ACMer,他们对于算法各有所长。但实验室名额有限,我们决定从第一批报名的同学中先选择3位同学组建一个ACM团队,要求这个团队精通所有的算法,这样团队的综合能力就比较全面。如果团队内的任两位同学精通同一种算法,这也是我们希望的,这使团队的交流合作会更加顺畅,因此我们也希望这种情况越多越好。
现在有一大堆同学的申请摆在我们面前,你能帮助我们找到这样一个团队吗?
输入
本题有多组数据。
每组数据的第一行有两个整数N, M (1 <= N,M <= 100)分别代表申请的同学总数和算法总数。
接下来的N行,每行第一个都是整数C(1 <= C <= 100) 代表这位同学精通C种算法,接着这一行会有C个整数,代表这位同学所精通的算法(算法用一个数字表示)。
输出
每组数据输出一行。
如果能组建一个团队,请按从小到大的顺序依次输出所招同学的序号。如果团队组建有多种方案,则优先选择先申请的同学(即序号小的同学)。如样例1,有135和145两种方案可供选择,则取135这种方案为最终方案.
如果不能按要求组建团队,只要输出大写的"NO"。
样例输入
6 7
3 1 4 7
2 1 4
3 4 5 7
3 3 5 6
4 2 3 6 7
2 2 7
5 8
3 2 4 7
2 3 4
3 4 5 7
3 3 5 6
5 2 3 6 7 8
样例输出
1 3 5
NO
提示
不解释 看题意
注意 当2个队伍都符合要求 都能解决各种题目的话 要优先选取重复多的
#include<stdio.h>
#include<string.h>
struct haha
{
int pos;
int num;
int vis[105];
}a[105];
int flag,maxnum;
int main()
{
int n,m,i,j,k,p,ai,aj,ak;
while(scanf("%d %d",&n,&m)!=EOF)
{
maxnum=0;
for(i=1;i<=n;i++)
{
memset(a[i].vis,0,sizeof(a[i].vis));
scanf("%d",&k);
a[i].num=k;
a[i].pos=i;
int q;
for(j=1;j<=k;j++)
{
scanf("%d",&q);
a[i].vis[q]=1;
}
}
flag=1;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
for(k=j+1;k<=n;k++)
{
int mid=a[i].num+a[j].num+a[k].num;
if(mid>=m&&mid>maxnum)
{
for(p=1;p<=m;p++)
if(a[i].vis[p]||a[j].vis[p]||a[k].vis[p]) continue;
else break;
if(p==m+1)
{
flag=0;
maxnum=mid;
ai=i;
aj=j;
ak=k;
}
}
}
}
}
if(flag==0) printf("%d %d %d\n",ai,aj,ak);
else printf("NO\n");
}
return 0;
}