X-man

导航

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;
}

 

 @@:此题用二进制存储状态!

posted on 2013-04-18 15:49  雨钝风轻  阅读(220)  评论(0编辑  收藏  举报