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 用空格隔開 第二行至第...