您的位置:首页 > 其它

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

2015-10-08 07:44 267 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: