권리 지수

권리 지수
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 418    Accepted Submission(s): 285
Problem Description
선거 문제 에 서 는 모두 n 개의 작은 단체 가 있 고 작은 단체 마다 일 정량의 표를 가지 고 있다.이 중 m 개 소 단체의 표 수 와 전체 표 의 절반 을 넘 으 면 이 조합 은 '승리 연맹' 이다.n 개 단 체 는 몇 개의 승리 연맹 을 형성 할 수 있다.작은 단체 가 '관건 적 인 가입자' 가 되 려 는 조건 은 자신 이 있 는 승리 연맹 에서 이 작은 단체의 가입 이 부족 하면 이 연맹 은 승리 연맹 이 될 수 없다 는 것 이다.한 작은 단체의 권리 지 수 는 한 작은 단체 가 모든 승리 연맹 에서 '관건 적 인 가입자' 가 되 는 횟수 를 말한다.각 소 단체의 권리 지 수 를 계산 해 보 세 요.
 
Input
데 이 터 를 입력 하 는 첫 번 째 행 위 는 T 조 테스트 데이터 가 있 음 을 나타 내 는 정수 T 입 니 다.각 그룹 테스트 데이터 의 첫 번 째 행 위 는 정수 n (0 < n < 20) 입 니 다.두 번 째 줄 에는 n 개의 정수 가 있 는데 각각 1 번 부터 n 번 작은 단체의 표 수 를 나타 낸다.
 
Output
각 그룹의 테스트 데 이 터 를 같은 줄 에서 n 번 작은 단체의 권리 지 수 를 순서대로 출력 합 니 다.
 
Sample Input

   
   
   
   
2 1 10 7 5 7 4 8 6 7 5

 
Sample Output

   
   
   
   
1 16 22 16 24 20 22 16

 
Author
lwg
 
Source
HDU 2006-12 Programming Contest
 
Recommend
LL
나 는 이 문제 가 그렇게 간단 한 상태 압축 이 왜 200 명 이상 만 지나 가 는 지 묻 고 싶다.
무슨 말 을 하고 싶 지 않 으 면 바로 코드 를 올 려 라.
#include <stdio.h>
#include <string.h>

int ans[25];
int a[25];

int main()
{
    int i,j,n,s,sum,T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        sum=0;
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        memset(ans,0,sizeof(ans));
        for (i=0;i<(1<<n);i++)
        {
            s=0;
            for (j=0;j<n;j++)
            {
                if ((i & (1<<j))!=0) s+=a[j];
            }
            if (2*s<=sum) continue;
            for (j=0;j<n;j++)
            {
                if ((i & (1<<j))!=0)
                {
                    if (2*(s-a[j])<=sum) ans[j]++;
                }
            }
        }
        for (i=0;i<n-1;i++)
        {
            printf("%d ",ans[i]);
        }
        printf("%d
",ans[i]); } return 0; }

좋은 웹페이지 즐겨찾기