题目大意:
这道题有N个bead,这些bead形状和大小相同,重量不同。N是奇数,你的任务是找出中间重量的bead。我们给出一系列描述,通过这些描述,我们可能可以找出一些bead不可能是中间bead,比如例子中的bead 1和bead 4。bead 1比2,4,5都轻,bead4比1,2,3都重,所以不可能。写一个程序数一下不可能是中间重量bead的数量。
解题思路:
暴力求解。
map[i][j]记录i比j重,com[i][j]记录i比j轻。然后我们通过遍历,把有传递性的元素也都记录。最后,我们数一下就可以了。
代码如下:
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<cstdio>
using namespace std;
int map[110][110];
int com[110][110];
int flag[110];
int main()
{
int ncases,n,m,i,j,k,ans,from,to;
scanf("%d",&ncases);
while(ncases--)
{
memset(map,0,sizeof(map));
memset(com,0,sizeof(com));
memset(flag,0,sizeof(flag));
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&from,&to);
map[from][to]=1;
com[to][from]=1;
}
for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++)
{
for(j=1;j<=n;j++)
{
if(map[k][i]&&map[i][j])
{
map[k][j]=1;
}
}
}
}
for(i=1;i<=n;i++)
{
ans=0;
for(k=1;k<=n;k++)
{
if(map[i][k]==1)
{
ans++;
}
}
if(ans>=(n+1)/2)
{
flag[i]=1;
}
}
for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++)
{
for(j=1;j<=n;j++)
{
if(com[k][i]&&com[i][j])
{
com[k][j]=1;
}
}
}
}
for(i=1;i<=n;i++)
{
ans=0;
for(k=1;k<=n;k++)
{
if(com[i][k]==1)
{
ans++;
}
}
if(ans>=(n+1)/2)
{
flag[i]=1;
}
}
ans=0;
for(i=1;i<=n;i++)
{
if(flag[i])
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}