/* 思路:遍历所有2^n个集合,对于每个集合求票和,如果满足票为优胜团体,而再对集合每个成员比较,是否满足变成非优胜团体,是的话,对于该成员对应结果+1。 重点:利用二进制思想,所有团体均对应0~2^n-1的一个十进制数对应,而判别团体成员则需要用到位运算,比如团体9,对应的是1001,则包含第四个团体和第一个团体。 则判断团体号num,如果((num>>j)&1)==1,则是有该成员。这就是所谓状态压缩吧? */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int a[21],res[21]; int n,sum; int main(){ int cases,i,j,tmp; scanf("%d",&cases); while(cases--){ memset(res,0,sizeof(res)); cin>>n; sum=0; for(i=0;i<n;i++){ scanf("%d",&a[i]); sum+=a[i]; } for(i=0;i<(1<<n);i++){ tmp=0; for(j=0;j<n;j++) { if((i>>j)&1) tmp+=a[j]; //该团体的总票 } if((tmp<<1)<sum) continue; for(j=0;j<n;j++){ if((i>>j)&1) //每一个成员 { if( ((tmp-a[j])<<1) <sum) res[j]++; } } } for(i=0;i<n-1;i++) printf("%d ",res[i]); printf("%d ",res[n-1]); } return 0; }高校俱乐部 选举问题:仅仅需要多加独裁判断!