//首先在每次二分之后有两个比较强的剪枝:如果a包含了b,去掉b;如果必须选a,选上a;
//之后在搜索的过程中再加一下剪枝
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <bitset>
using namespace std;
#define ll __int64
int n,k;
ll x[100],y[100];
ll map[100][100];
bool vis[100];
char ts[100];
struct Dian
{
bitset<65> b;
int cnt;
}dians[100];
bool cmp(struct Dian a,struct Dian b)
{
return a.cnt>b.cnt;
}
bool dfs(int temp,int lk,bitset<65> bc,int sum)
{
bitset<65> tt;
if(bc.count()==n) return true;
if(temp>=sum+1 || lk<=0) return false;
tt=(bc|dians[temp].b);
if(tt!=bc && lk*dians[temp].cnt>=n-bc.count())
{
if(dfs(temp+1,lk-1,tt,sum)==true) return true;
}
if(lk*dians[temp].cnt>=n-bc.count())
{
if(dfs(temp+1,lk,bc,sum)==true) return true;
}
return false;
}
bool check(ll temp)
{
int i,j,cnt=0;
for(i=1;i<=n;i++)
{
dians[i].b=0;
for(j=1;j<=n;j++)
{
if(map[i][j]<=temp)
dians[i].b[j]=1;
}
dians[i].cnt=dians[i].b.count();
}
sort(dians+1,dians+n+1,cmp);
memset(vis,true,sizeof(vis));
//去掉无用项
for(i=1;i<=n;i++)
{
if(vis[i]==1)
{
dians[++cnt]=dians[i];
for(j=n;j>i;j--)
{
if(dians[i].b==(dians[i].b|dians[j].b))
vis[j]=0;
}
}
}
//选出必须项
bitset<65> bc(0);
memset(vis,true,sizeof(vis));
int num,tt,tk,cntt=0;
tk=k;
for(i=1;i<=n;i++)
{
num=0;
for(j=1;j<=cnt;j++)
{
if(dians[j].b[i]==1)
{
num++;
tt=j;
}
}
if(num==1 && vis[tt]==true)
{
bc=(bc|dians[tt].b);
tk--;
vis[tt]=false;
}
}
if(tk<0)
return false;
for(i=1;i<=cnt;i++)
{
if(vis[i]==1)
{
dians[++cntt]=dians[i];
}
}
return dfs(1,tk,bc,cntt);
}
ll bs(ll left,ll right)
{
ll mid;
while(left<right)
{
mid=(left+right)>>1;
if(check(mid)==0) left=mid+1;//if(不符合条件)
else right=mid;
}
return left;
}
int main()
{
int T,R;
scanf("%d",&T);
for(R=1;R<=T;R++)
{
int i,j;
ll da=0;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%I64d%I64d",&x[i],&y[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
map[i][j]= (x[i]>x[j]?x[i]-x[j]:x[j]-x[i])+(y[i]>y[j]?y[i]-y[j]:y[j]-y[i]);
if(map[i][j]>da)da=map[i][j];
}
ll ans;
ans=bs(0,da);
printf("Case #%d: %I64d\n",R,ans);
}
return 0;
}
hdu 5046 重复覆盖问题 搜索+剪枝
最新推荐文章于 2022-04-02 14:54:40 发布