cf#306-B. Preparing Olympiad-bitmask暴力

来源:互联网 发布:隔音玻璃效果好吗 知乎 编辑:程序博客网 时间:2024/05/17 04:15

n=15,L,R,X

给你n个背包,每个带有一个价值

要求你选一定数量的背包, 使得总价值sum>=L && sum<=R  

并且单个背包最大价值maxx-最小价值minn >= X;

n太小,直接用 数的二进制表示每个背包的选择状态,最多就2^15

对每个状态判断一下是否合法即可


#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std;#define inf 1e9+1__int64 tm[20];int main(){    __int64 i;    __int64 n,l,r,x;    scanf("%I64d%I64d%I64d%I64d",&n,&l,&r,&x);    for (i=1;i<=n;i++)        scanf("%I64d",&tm[i]);        __int64 cun=(__int64)pow(2.0,n)-1;    __int64 ans=0;    for (i=1;i<=cun;i++)    {        __int64 sum=0;        __int64 minn=inf;        __int64 maxx=0;        __int64 tmp=i;        __int64 cou=1;        while(tmp)        {            if (tmp&1)            {                sum+=tm[cou];                    if (tm[cou]>maxx)                        maxx=tm[cou];                    if (tm[cou]<minn)                        minn=tm[cou];             }            tmp>>=1;            cou++;        }        if (sum>=l&&sum<=r )            if (maxx-minn>=x)                ans++;    }    printf("%I64d\n",ans);    return 0;    }


0 0
原创粉丝点击