2012 ACM/ICPC Asia Regional Changchun Online USACO ORZ

http://acm.hdu.edu.cn/showproblem.php?pid=4277

思路:暴力;

View Code
#include<stdio.h>
#include<iostream>
#include<set>
using namespace std;
#define MAXN 16
#define STA 1<<17
int up,a,bc,b,c;
int num[MAXN],val[STA];
set<int>Map[150005];

void inite()
{
    int i,pos,temp;
    for(i=0;i<=up;i++)
    {
        temp=i;
        pos=val[i]=0;
        while(temp)
        {
            if(temp&1)
            {
                val[i]+=num[pos];
            }
            temp>>=1;
            pos++;
        }
    }
    return ;
}
void fun(int s,int s1,int pos)
{
    int temp;
    if((1<<pos)>up)return;
    b=val[s1];
    c=val[s^s1];
    if(a>=b&&a>=c&&c){
        if(b<c)b^=c^=b^=c;
        Map[a].insert(b);
    }
    temp=(1<<pos);
    while(((s&temp)==0)&&(temp<up))
    {
        ++pos;
        temp=(1<<pos);
    }
    fun(s,s1+(1<<pos),pos+1);
    fun(s,s1,pos+1);
}
int main()
{
    int T,N,i,sum,ans;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        up=1<<N;up--;
        for(sum=i=0;i<N;i++)
        {
            scanf("%d",&num[i]);
            sum+=num[i];
        }
        for(i=1;i<=sum;i++)
            Map[i].clear();
        inite();
        for(i=1;i<up;i++)
        {
            a=val[i];
            bc=val[up^i];
            if(bc>a)
                fun(up^i,0,0);
        }
        ans=0;
        for(i=1;i<=sum;i++)
        {
            ans+=Map[i].size();
        }
        printf("%d\n",ans);
    }
    return 0;
}

posted on 2012-09-08 20:13  aigoruan  阅读(182)  评论(0)    收藏  举报

导航