bob有2n
位元組的記憶體,編號為[0
,2n−
1)。他想對每個位元組的記憶體分別分配乙個值。對於編號為
i 的記憶體,如果它被分配了乙個值j(
0≤j<2m
),那麼該位元組產生的基本歡樂值為wi
,j。更歡樂的是,每乙個位元組還有乙個臨界值ci
。對於兩個不同的位元組,編號分別為a,
b(a,如果以下兩個條件同時成立,那麼就會產生額外歡樂值ua
^ub 。
1.在二進位制下,
a 和
b有且僅有一位不同(例如
4 和5,
4 的二進位制為
100,
5 的二進位制為
101,有且僅有第
3 位不同)。
2.在a
位元組分配的值不少於
a 位元組的臨界值ca
,或者在
b 位元組分配的值不少於
b位元組的臨界值cb
。一種分配方法的總歡樂值是每個位元組的基本歡樂值的總和加上額外歡樂值。
bob想找到一種最佳分配方法,使得總歡樂值最大。如果有多組解,請任意輸出一種。1≤
n,m≤
8,0≤
ci<2m
,0≤u
i<
1024,−
1024≤w
i,j<
1024
對於乙個位元組的記憶體
i ,分配的值只可能是兩個,
j和j≥c
i 的使wi
,j最大的
j ,分別是v1
i,v2
i。因為對於每一組滿足條件的a,
b ,只有兩個位置都小於ca
,cb 時才沒有收益。可以看出這是乙個最小割的模型,割就是要放棄的收益。
但是還有乙個問題,兩個點都割掉左邊的邊才有額外代價,這就會出現問題。我們觀察一下一般的棋盤是怎麼解決這個問題的:黑白染色。那麼這個問題能不能用類似的方法做呢?答案是可以。因為兩個不同的點連邊的條件是二進位制位相差
1 ,這樣連邊是不會出現奇環的,所以我們可以把二進位制中
1的個數為奇數的點反過來連邊
所以連邊方案就變成了:
1.如果
i 的二進位制中
1的個數為奇數,就連邊(s
,i,v
1i) ,割掉這條邊代表選擇v2
i 。同樣的,連邊(i
,t,v
2i) 。
2.如果
i 的二進位制中
1的個數為偶數,就連邊(s
,i,v
2i) 和(i
,t,v
1i) 。
3.如果a,
b 滿足
a 的二進位制中
1的個數是奇數,
b 的二進位制中
1的個數是偶數,就連邊(a
,b,u
a^ub
) 。這條邊只有在(s
,a) 和(b
,t) 都被選擇,即選擇v1
a 和v1
b 的情況下才會被選中。
然後跑網路流,用邊權和減掉流量就是答案。
那麼會有幾個問題。
1.怎麼算每個點選那邊?從原點開始bfs,遍歷到的點都選另一邊(即(i
,t) 對應的方案),沒遍歷到的點選這一邊((s
,i) )。
2.怎麼算每個點分配什麼值?從大到小列舉,第乙個滿足條件的就是答案。因為wi
,j相同的情況下選
j 比較大的不會比選
j比較小的劣。
3.邊權可能是負數。因為所有邊權都≥−
1024
,可以把所有邊權都加上乙個
≥1024
的數。時間複雜度:o(
???)
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef pair pii;
struct
list
void add(int x,int y,int z)
};list l;
void add(int x,int y,int z)
int op(int x)
int d[1
<<9];
int s,t;
int bfs()
}return0;}
int dfs(int x,int flow)
if(flow)
d[x]=-1;
return s;
}int w[1
<<9][1
<<9];
int u[1
<<9];
int c[1
<<9];
int v1[1
<<9];
int v2[1
<<9];
int ans[1
<<9];
int b[1
<<9];
int bitcount(int x)
return s;
}int main()
for(i=1;i<=(1
<1);
s=(1
<1;
t=(1
<2;
int sum=0;
for(i=1;i<=(1
else
int s=0;
while(bfs())
s+=dfs(s,0x7fffffff);
for(i=1;i<=(1
ans[i]=v1[i];
else
ans[i]=v2[i];
for(i=1;i<=(1
<1;j>=0;j--)
if(w[i][j]==ans[i])
return
0;}
隨機訪問儲存器(RAM)
隨機訪問儲存器 隨機訪問儲存器 英語 random access memory,縮寫 ram 也叫主存,是與cpu直接交換資料的內部儲存器。它可以隨時讀寫 重新整理時除外 而且速度很快,通常作為作業系統或其他正在執行中的程式的臨時資料儲存介質。ram工作時可以隨時從任何乙個指定的位址寫入 存入 或讀...
唯讀儲存器和隨機儲存器有什麼區別
唯讀儲存器又稱rom這裡面的資料寫進去後是不可以改變的,就和我們看的vcd盤一樣,但是必要的時候也是可以改變的,這裡面一般存的是一些系統資訊,和系統設定,電腦的bios晶元就是rom,隨機儲存器又稱ram,它是一種臨時存放資料的地方,它的訪問速度很快,所以在電腦執行軟體的時候就把程式調入記憶體 ra...
什麼是隨機訪問 SRAM儲存器是什麼儲存器
sram儲存器 靜態隨機訪問儲存器 是一種只要在供電條件下便能夠儲存資料的儲存器件,而且是大多數高效能系統的乙個關鍵部分。sram儲存器是隨機訪問儲存器的一種。所謂的 靜態 是指這種儲存器只要保持通電,裡面儲存的資料就可以恆久保持。對比dram儲存器裡面所儲存的資料需要週期性做出更新。但當電力 停止...