zoj2500
来源:互联网 发布:淘宝怎样更换淘宝账号 编辑:程序博客网 时间:2024/04/28 05:05
题目大意:
这道题有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;}
0 0