jzoj 1262 為奶牛熄燈

2021-08-06 03:58:34 字數 2108 閱讀 3774

奶牛們喜歡在黑暗的環境裡睡覺。當她們每晚回到牛棚準備睡覺時,牛棚裡有l(3<=l<=50)盞燈仍然亮著。所有燈的開關按編號公升序排成一列,最左邊的那個開關控制1號燈(所謂控制,也就是如果1號燈現在亮著,那麼按這個開關會使1號燈熄滅,否則這個操作會使1號燈被點亮)。由於奶牛們的蹄子過於粗大,沒法方便地按開關,她們總是用乙個特製的乾草叉來進行對開關的操作。這個叉子設計了t(1<=t<=7)個叉尖,相鄰叉尖的距離正好與相鄰開關的距離相等。但是現在有些叉尖被折斷了。比如說,t=4的乙個乾草叉,它的第3根叉尖被折斷了,我們就用'1101'來描述它。

如果把這個叉子的最左端對準那一列開關的最左端,按下,那1號、2號和4號燈的狀態會被改變(3號燈的狀態不變,因為那個叉尖被折斷了)。在進行這樣的操作的時候,任何乙個叉尖都必須有乙個對應的開關,也就是說,叉子的邊緣不能在那一列開關的範圍外,即使邊緣處的叉尖已經被折斷。

現在,你已經知道了各個燈的狀態,以及乾草叉現在的情況,請你找出乙個操作序列,使得在所有操作完成之後,仍然亮著的燈的數目最少。

第1行: 兩個用空格隔開的整數:l 和 t

第2行: 乙個長度為l的字串,串中不含空格且元素均為'0'或'1'。第i個元素是'1'則表示第i盞燈亮著,是'0'的話就表示第i盞燈已經被關掉

第3行: 乙個長度為t的字串,只含'0'或'1'(同樣不含空格)。如果第i個元素是'1',說明乾草叉的第i根叉尖仍完好無損,否則說明第i根叉尖已經被折斷

第1行: 輸出乙個正整數k,即為了達到目的一共需要用叉子按多少次開關
10 4

1111111111

1101

5
由於叉子最多7個齒,而燈不超過50盞,所以可以使用狀壓dp。

f[i][j][k]表示前i盞燈,j盞亮著,k為後t-1盞的二進位制狀態。

從i到i+1時,可以選著叉或不叉。

t=k*2+a[i+1];

p=t^z;

t=p%(1<<(l-1));

f[i+1][j-h[k]+h[p]][t]=min(f[i+1][j-h[k]+h[p]][t],f[i][j][k]+1);

t=k*2+a[i+1];

t=t%(1<<(l-1));

f[i+1][j+a[i+1]][t]=min(f[i+1][j+a[i+1]][t],f[i][j][k]);

h[i]表示i二進位制下1的個數

#include

#include

#include

#include

#include

using namespace std;

#define n 55

#define t 128

#define inf 0x7fffffff

int a[n],z=0;

int h[t];

int f[n][n][t];

int l,n,t,p;

int ans,s;

char c;

void pre()

}}void init()

scanf("\n");

for (int i=l;i>=1;--i)

}int main()

f[l-1][t][p]=0;

for (int i=0;i<=n;++i)

for (int j=0;j<=n;++j)

for (int k=0;k<=(1

<<(l-1))-1;++k)

if (f[i][j][k]!=inf/2)

s=n;

ans=inf/2;

for (int i=0;i<=n;++i)

for (int j=0;j<=(1

<<(l-1))-1;++j)

if (f[n][i][j]!=inf)

if (i<=s && f[n][i][j]s=i;

ans=f[n][i][j];

}else

if (i>s) break;

printf("%d\n",ans);

return

0;}

Input poj 1262 計算幾何

乙個地板被若干磚所覆蓋。現在請你判斷,這些磚是否恰好不重複,不遺漏的恰好覆蓋了整個地板。第一行為乙個整數n,表示有n組測試資料。每組測試資料第一行是兩個數l,w,表示地板的長和寬 不超過40000 第二行是乙個數t,表示有t塊磚 1 t 400 下面t行每行是四個數,xl,yl,xh,yh,其中 x...

XTU1262 優先佇列

使用優先佇列模擬一下就可以了,但是需要注意進行優化,題目有b 0的情況,也就是說無論如何撈魚都不會變,這種情況需要直接優化掉,不能進行模擬,否則會超時。include define ll long long define up i,l,h for int i l i define down i,h,...

hdu1262詳細題解

problem description 哥德 猜想大家都知道一點吧.我們現在不是想證明這個結論,而是想在程式語言內部能夠表示的數集中,任意取出乙個偶數,來尋找兩個素數,使得其和等於該偶數.做好了這件實事,就能說明這個猜想是成立的.由於可以有不同的素數對來表示同乙個偶數,所以專門要求所尋找的素數對是兩...