«問題描述:
假設有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.放在柱子最下...