P2765 魔術球問題(網路流24題)

2022-05-01 07:12:10 字數 2190 閱讀 3254

«問題描述:

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,...的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。

試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。

«程式設計任務:

對於給定的n,計算在n根柱子上最多能放多少個球。

輸入格式:

第1 行有1個正整數n,表示柱子數。

輸出格式:

程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。

輸入樣例#1: 複製

4

輸出樣例#1: 複製

11

1 82 7 9

3 6 10

4 5 11

這題其實和上一題差不多,不過這個是反正過來的。

這題需要轉化一下

求對於給定的n,計算在n根柱子上最多能放多少個球。

一開始無從下手,但是它給了乙個條件

在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。

將他轉化為二分圖,

求最大匹配數,

點數=兩點最大匹配數+最小路徑覆蓋數,

它給的n就是最小路徑覆蓋數,網路流跑最大匹配數

然後點數就出來了

這裡採取的是列舉的方法

求點數,

然後就是上**

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7 #include 8 #include 9

using

namespace

std;

10const

int maxn = 2e5 + 10;11

const

int inf = 1e9 + 7

;12 typedef long

long

ll;13

int st = 0, ed = 4000;14

struct

node ;

17struct

dinic

26void

clearflow()

30void add(int

from, int to, int

cap) );

34nodes.push_back((node) );

37 m =nodes.size();

38 g[from].push_back(m - 2

);39 g[to].push_back(m - 1

);40}41

bool

bfs() 58}

59}60return

vis[t];61}

62int dfs(int x, int

a) 74}75

return

flow;76}

77int maxflow(int a, int

b) 85

return

flow;86}

87void print(int

u) 95}96

}97} f;

98int

main()

109 flow +=f.maxflow(st, ed);

110}

111 num -= 1

;112

f.clearall(ed);

113f.clearflow();

114 memset(f.vis, 0, sizeof

(f.vis));

115for (int i = 1 ; i <= num ; i++)

121}

122f.maxflow(st, ed);

123 printf("

%d\n

", num);

124 memset(f.vis, 0, sizeof

(f.vis)) ;

125for (int i = 1 ; i <= num ; i++)

131}

132return0;

133 }

P2765 魔術球問題

題目描述 問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。程式設計任務 對...

P2765 魔術球問題

p2765 魔術球問題 貪心模擬就可以過.好像和dinic沒啥關係 找找規律發現可以貪心放。n又灰常小。設答案 m 你可以 o mn 直接模擬過去 閒的慌得話可以像我用個 set 維護 複雜度可以降為 o mlogn 網路流.不會寫 逃 口胡一下dinic 乙個點 u 拆成2個表示 1.放在柱子最下...

P2765 魔術球問題

每個數可以放在和它和是平方的數上面 我們可以想到,如果乙個點可以放在某個點上面是那個點向它連邊 如果乙個點向它所有能連的點連邊,那麼它的最小鏈覆蓋就是我們要找的答案 經過簡單推理可以發現,每個點可以連線的點的大小是遞增的,那麼把編號小的點放在柱子下面一定更優 這樣連邊就行了 include incl...