USACO4 1 2 柵欄的木料 爆搜剪枝優化

2021-07-02 06:55:58 字數 2426 閱讀 1666

executing...

test 1: test ok [0.005 secs, 3392 kb]

test 2: test ok [0.005 secs, 3392 kb]

test 3: test ok [0.008 secs, 3392 kb]

test 4: test ok [0.097 secs, 3392 kb]

test 5: test ok [0.005 secs, 3392 kb]

test 6: test ok [0.062 secs, 3392 kb]

test 7: test ok [0.005 secs, 3392 kb]

test 8: test ok [0.011 secs, 3392 kb]

test 9: test ok [0.030 secs, 3392 kb]

test 10: test ok [0.005 secs, 3392 kb]

test 11: test ok [0.005 secs, 3392 kb]

test 12: test ok [0.008 secs, 3392 kb]

all tests ok.

二分答案! 我真的沒想到,看了nocow的題解。

把need從小到大排序

1、假設前k個need可以得到,那麼首先可以知道前k個need木板的總和,也就可以計算出需要浪費的木板總量tot_wast。

因為已經精確到要浪費的總量了,某個切割方案讓浪費的總量超過tot_wast,顯然是無解的

2、因為只有128種數字,卻有1000多木板,所以各種木板是重複的大小,這就有乙個搜尋次序的情況了。 比如有2個need木板都是5,5.

在當前的give的木板上,我切後一塊,不要前一塊。 這樣會造成大量的重複運算,所以需要用一些方法來處理掉這些多餘的計算量。

3、嘗試要哪些need的時候,要從大到小! 

for (int i = max_need; i >=0 ; -- i)

flag = dfs(k, len - need[i], get + 1, wast);

if (flag) return true;

vis[i] = 0;

ifusd =true;

}

for (int i = max_need; i >=0 ; -- i)

改為

for (int i = 0; i <= max_need ; ++ i)

時間差距巨大無比! 後者跑了20秒都不出答案……前者就快多了.

原因? 資料的原因嘛?我不認為如此。

首先眾所周知,索樹在開始的樹枝被剪的效果永遠比在結尾被剪效果來的好~

試大的,會很大程度的造成【快速浪費】,根據前面的浪費條件的剪枝原理,快速剪掉很多,快速出解。

/*

task:fence8

lang:c++

*/#include #include #include #include #include using namespace std;

int gived_num, need_num;

int gived[55], need[1050];

int sum[1050]=;

int tot_give(0);

void init()

int max_wast, max_need;

bool vis[1050] = ;

int cut_num[1050];

bool dfs(int k, int len, int get, int wast) //當前切第k個木料,第k個木料還剩多少長度, 浪費的總量

flag = dfs(k, len - need[i], get + 1, wast);

if (flag) return true;

vis[i] = 0;

ifusd =true;

} //下一塊木料,這個不用了

if (ifusd) return false; //這塊能切割,但是不切割,肯定是不行的,false

flag = dfs(k + 1, gived[k + 1], get, wast + len);

if (flag) return true;

return false;

}bool check(int k) //前k個need全部製作出來

void doit()

int left = 0, right = need_num; // [);

int mid;

while (left + 1 < right) //序號[left, right)合法

cout << left + 1 << endl;

}int main()

USACO 4 1 2 柵欄的木料

這個講的超好.一定要看.然後看我 就好懂啦.各種優化確實非常好.搜尋的一道好題.掛 problem usaco 4.1.2 柵欄的木料 author robert yuan 優化解釋 0.二分 貪心判斷可行解 根據自己設計的貪心演算法盡量的得到乙個比較靠近正確值的 ans,再後面的搜尋的下界就會大大...

USACO2 4 2 穿越柵欄

問題描述 fj搭建了乙個巨大的用柵欄圍成的迷宮。幸運的是,他在迷宮的邊界上留出了兩段柵欄作為迷宮的出口,並且從迷宮中的任意一點都能找到一條走出迷宮的路。給定迷宮的寬 w 及長 h 和這個迷宮,然後計算從迷宮中最 糟糕 的那乙個點走出迷宮所需的最少步數。輸入格式 第一行 w和h 用空格隔開 第二行至第...

USACO 2 4 2 穿越柵欄

問題描述 fj搭建了乙個巨大的用柵欄圍成的迷宮。幸運的是,他在迷宮的邊界上留出了兩段柵欄作為迷宮的出口,並且從迷宮中的任意一點都能找到一條走出迷宮的路。給定迷宮的寬 w 及長 h 和這個迷宮,然後計算從迷宮中最 糟糕 的那乙個點走出迷宮所需的最少步數。輸入格式 第一行 w和h 用空格隔開 第二行至第...