zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    ssh 免密
    SCALA XML pattern attrbute(属性)
    数据库分区的概念
    Intellij IDEA 快捷键整理
    笔记--Linux
    netstat
    笔记--MySQL相关操作
    ip地址
    使用ASMCMD管理Oracle ASM
    使用RMAN执行Oracle ASM数据迁移
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3028694.html
Copyright © 2011-2022 走看看