«問題描述:
假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,...的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。
«程式設計任務:
對於給定的n,計算在n根柱子上最多能放多少個球。
輸入格式:
第1 行有1個正整數n,表示柱子數。
輸出格式:
程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。
輸入樣例#1: 複製
4
輸出樣例#1: 複製
111 82 7 9
3 6 10
4 5 11
這題其實和上一題差不多,不過這個是反正過來的。
這題需要轉化一下
求對於給定的n,計算在n根柱子上最多能放多少個球。
一開始無從下手,但是它給了乙個條件
在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
將他轉化為二分圖,
求最大匹配數,
點數=兩點最大匹配數+最小路徑覆蓋數,
它給的n就是最小路徑覆蓋數,網路流跑最大匹配數
然後點數就出來了
這裡採取的是列舉的方法
求點數,
然後就是上**
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #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...