luogu2765 魔術球問題

2021-08-02 12:04:47 字數 1430 閱讀 7307

«問題描述:

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

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

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

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

例如,在4 根柱子上最多可放11 個球。

«程式設計任務:

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

輸入輸出格式

輸入格式:

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

輸出格式:

程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。

檔案的第一行是球數。

接下來的n行,每行是一根柱子上的球的編號。

輸入輸出樣例

輸入樣例#1:

4輸出樣例#1:

111 8

2 7 9

3 6 10

4 5 11

又是一道最小路徑覆蓋:

我們可以列舉ans,

建立乙個二分圖

對於每乙個節點i,若有i+j=平方數,且i

其實我一開始的思路沒有問題,唯一就是要注意一下主程式中加邊和網路流進行時的寫法,

還有乙個讓我t了兩次的問題就是,我在一開始的時候x部和y部兩部分的點編號相差200,

顯然答案很可能超過200,

一位前輩說網上給出的範圍是ans<=1600,

所以把兩個點部的編號差距改為2000就a了

#include#include#include#includeusing namespace std;

const int inf=0x33333333;

const int n=500010;

int n;

struct node;

node way[n*2];

int st[n],tot=-1,ans,deep[n],s,t,tt=0,list[n]; //ans是最大流

bool p[n];

int sqr[101]=;

void add(int u,int v,int z)

void lianbian()

int bfs()

} }return !p[t];

}int dfs(int now,int t,int limit)

} return flow;

}void print()

}else //這個柱子上只有乙個球

printf("\n");

} }return;

}void doit()

int main()

printf("%d\n",tt-1); //答案是當前擁有的節點-1

print();

return 0;

}

luogu2765 魔術球問題

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

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.放在柱子最下...