hdu 1557(权利指数)
思路:
**用二进制表示状态,暴力枚举!
傻瓜式算法描述:
1.用二进制列举所有的状态
2.找票数之和大于总票数一半的状态
3.在这些状态中,若去掉某个小团体之后,不满足票数之和大于总票数一半,则为关键团体,加一。
#include<stdio.h> #include<string.h> int data[21]; int ans[21]; int main() { int n,T; int i,j,sum,isum,tmp; float bsum; int m;//记录所有的状态 scanf("%d",&T); while(T--) { sum=0; memset(ans,0,sizeof(ans)); memset(data,0,sizeof(data)); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&data[i]); sum+=data[i]; } bsum=(float)sum/2; m=(1<<n)-1; for(i=1;i<m+1;i++)//枚举状态1~~m { isum=0; for(j=0;j<n;j++)//二进制的为表示各团体的状态 { tmp=i>>j; if(tmp&1)isum+=data[j]; } if(isum>bsum)//printf("%d**",i); for(j=0;j<n;j++) { tmp=i>>j;//一种状态下有两个团体有记录 if((tmp&1)&&isum-data[j]<=bsum)//改了好久,既然是忘了‘==’ ans[j]++; } } for(i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[n-1]); } return 0; }