http://poj.org/problem?id=1975
数量是N的话,其中的某个大于或小于(N+1)/2,就不可能是中间值;对于以下测试数据
5 4 2 1 4 3 5 1 4 2一共有5个,2>1,4>3,5>1,4>2,其中可由4>2,2>1推出4>1,因此可通过建立矩阵的方法找其连通点,如果连通点多余(N+1)/2时,则找到一个不符合条件的,计数变量加一;
上面的最终构成的有向矩阵为
1 2 3 4 5 每行的1表示该行重量大于,每列的1表示该列重量小于,没有关联的都标为0.
1 0 0 0 0 0
2 1 0 0 0 0
3 0 0 0 0 0
4 1 1 1 0 0
5 1 0 0 0 0
#include<stdio.h> #include<string.h> int main() { int t,mark[100][100]; int i,j,k; int N,M,x,y,max,min,num; scanf("%d",&t); while(t--) { scanf("%d%d",&N,&M); memset(mark,0,sizeof(mark)); for(i=1;i<=M;i++) { scanf("%d%d",&x,&y); mark[x][y]=1; } for(k=1;k<=N;k++) for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { if(mark[i][k]==1&&mark[k][j]==1) mark[i][j]=1; //mark[i][j]=mark[i][j]|(mark[i][k]&mark[k][j]); } } max=0;min=0;num=0; for(i=1;i<=N;i++,max=0,min=0) { for(j=1;j<=N;j++) max+=mark[i][j]; if(max>=(N+1)/2) num++; for(j=1;j<=N;j++) min+=mark[j][i]; if(min>=(N+1)/2) num++; } printf("%d\n",num); } return 0; }