1. 程式人生 > >【習題 8-1 UVA - 1149】Bin Packing

【習題 8-1 UVA - 1149】Bin Packing

seve multi 題解 col txt emp blog erase 而且

【鏈接】 我是鏈接,點我呀:)
【題意】


在這裏輸入題意

【題解】


每個背包只能裝兩個東西。
而且每個東西都要被裝進去。
那麽我們隨意考慮某個物品。(不必要求順序
這個物品肯定要放進某個背包裏面的。
那麽背包數遞增。
那麽剩余的空間。
只能裝一個了。
要裝誰呢?
肯定是盡可能裝較大的.所以用upper_bound-1找一個最大的能裝的裝就可以了。
這樣就能盡量減少體積較大的物品了。

【代碼】

/*
    1.Shoud it use long long ?
    2.Have you ever test several sample(at least therr) yourself?
3.Can you promise that the solution is right? At least,the main ideal 4.use the puts("") or putchar() or printf and such things? 5.init the used array or any value? 6.use error MAX_VALUE? 7.use scanf instead of cin/cout? 8.whatch out the detail input require */ /* 一定在這裏寫完思路再敲代碼!!!
*/ #include <bits/stdc++.h> using namespace std; const int N = 1e5; int n,l; multiset<int> myset; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); int T; cin >> T; int kase = 0
; while (T--){ if (kase>0) cout << endl; kase++; myset.clear(); cin >> n >> l; for (int i = 1;i <= n;i++) { int x; cin >> x;myset.insert(x); } int cnt = 0; for (int i = 1;i <= n;i++){ if (myset.empty()) break; int x = (*myset.begin()); myset.erase(myset.begin()); cnt++; auto idx = myset.upper_bound(l-x); if (idx==myset.begin()) continue; idx--; myset.erase(idx); } cout << cnt << endl; } return 0; }

【習題 8-1 UVA - 1149】Bin Packing