HDU 4979(舞蹈鏈 打表)

2021-07-10 06:37:40 字數 1602 閱讀 7954

(

題意:在0 ~ 2^n-1中,選出盡量少的二進位制位有m個1的數,要求包含全部二進位制位含有r個1的數。n<=8。

解法:就是乙個重複覆蓋,但是不管怎麼剪枝都會超時,所以要打表交上去。

這是打表的程式

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

//#include

#include

//#pragma comment(linker, "/stack:1024000000,1024000000")

#define lson l, m, rt<<1

#define rson m+1, r, rt<<1|1

#define inf (1e9+7)

#define debug(a) cout << #a" = " << (a) << endl;

#define debugarry(a, n) for (int i = 0; i < (n); i++)

#define clr(x, y) memset(x, y, sizeof x)

#define ll long long

#define ll long long

#define ull unsigned ll

using

namespace

std;

const

int maxn = 1e5;

struct sad

l[0] = m;

r[m] = 0;

clr(h,-1);

si = m;

ans = inf;

}void link(int row,int col)else

h[row] = l[si] = r[si] = si;

}void remove(int c)

}void resume(int c)

}int vis[maxn];

int h()

return ret;

}void dfs(int cnt)

int c=r[0];

for(int i=r[0];i;i=r[i])

if(s[c]>s[i]) c=i;

for(int i=d[c];i-c;i=d[i])

}}dlx;

int rlog[maxn];

void init()

vector

int,int> >q;

int main()

int cnt=0;

q.clear();

for(int i=0;i<(1

dlx.init(cnt);

for(int i=0;i0);

printf("case #%d: %d\n",++case,dlx.ans);

}return

0;}

HDU 3529 舞蹈鏈之可重複覆蓋

點選開啟鏈結 題意 在點的地方放炸彈,炸彈可以炸到的地方無限遠並且是十字的形式,但是如果炸到 或者 則這個方向停下來,問最少需要多少炸彈同時引爆才可以將所有 炸掉 思路 一道模版舞蹈鏈了,對於建圖我們將所有的 看做列,然後所有的點也就是放炸彈的地方看做行,然後找一下每個點可以炸的 就可以了,建圖後跑...

hdu 4548 素數打表

方法 篩法打表,再將是素數的中判斷是不是美素數。比較裸。但是就是一開始這樣做會超時。重新用乙個陣列來儲存到當前數字時已經出現了幾個美素數,最後將區間兩端所對應的相互減一下就可以了。include include include using namespace std define m 1000001...

hdu 1443 Joseph 暴力打表

題目大意 k個好人,k個壞人,確定n,利用joseph方法刪除所有壞人.由於資料規模,可以利用暴力打表,以後能打表就盡量打表。這題原本模擬資料時間完全夠的,但是測試資料有很多重複的,導致很多人超時,暗坑!以後要注意點這種情況。打表 includeint main while scanf d n n ...