Điểm:
2000 (p)
Thời gian:
1.0s
Bộ nhớ:
512M
Input:
bàn phím
Output:
màn hình
Có \(n\) người muốn lên đến đỉnh của một tòa nhà mà chỉ có một thang máy. Bạn biết trọng lượng của mỗi người và trọng lượng tối đa cho phép trong thang máy. Số lần đi thang máy tối thiểu là bao nhiêu?
Input
- Dòng đầu tiên có hai số nguyên \(n\) và \(x\): số lượng người và trọng lượng tối đa cho phép trong thang máy.
- Dòng thứ hai chứa \(n\) số nguyên \(w_1,w_2,\ldots,w_n\): trọng lượng của mỗi người.
Output
- In một số nguyên: số lần đi tối thiểu.
Constraints
- \(1 \leq n \leq 20\)
- \(1 \leq x \leq 10 ^ 9\)
- \(1 \leq w_i \leq x\)
Example
Sample input
4 10
4 8 6 1
Sample output
2
Bình luận
include <bits/stdc++.h>
define el '\n'
define fu(i, a, b) for(long long i = a; i <= b; ++i)
define fd(i, a, b) for(long long i = a; i >= b; --i)
define ff first
define ss second
define all(v) v.begin(), v.end()
define mask(i) (1LL << (i))
define bit(x, i) (((x) >> (i)) & 1)
define sz(v) (ll) v.size()
using namespace std;
using ll = long long;
using ull = unsigned long long;
const long long N = 21, mod = 1e9 + 7, base = 29, inf = 1e18;
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll Rand(ll l, ll r) {
return uniform_int_distribution<ll> (l, r) (rng);
}
ll last(ll msk) {
return msk & (-msk);
}
ll pop_cnt(ll msk) {
return __builtin_popcountll(msk);
}
ll ctz(ll msk) {
return __builtin_ctzll(msk);
}
ll lg(ll msk) {
return 63 - __builtin_clzll(msk);
}
template <class T1, class T2>
bool minimize(T1 &a, T2 b) {
if (a > b) {
a = b;
return true;
}
return false;
}
template <class T1, class T2>
bool maximize(T1 &a, T2 b) {
if (a < b) {
a = b;
return true;
}
return false;
}
template <class T>
void print(T a) {
for (auto x : a) cout << x << " ";
cout << el;
}
template <class T>
void compress(vector<T> &a) {
sort(all(a));
a.resize(unique(all(a)) - a.begin());
}
ll n, x;
ll a[N];
pair<ll, ll> f[mask(N)];
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> x;
fu(i, 0, n - 1) cin >> a[i];
memset(f, 0x3f, sizeof(f));
f[0] = {1, 0};
fu(msk, 0, mask(n) - 1) {
ll leftover = (mask(n) - 1) ^ msk;
for (ll tmp = leftover; tmp > 0; tmp ^= last(tmp)) {
ll i = ctz(tmp);
ll newMsk = msk ^ mask(i);
if (f[msk].ss + a[i] <= x) {
if (f[newMsk].ff > f[msk].ff) {
f[newMsk].ff = f[msk].ff;
f[newMsk].ss = f[msk].ss + a[i];
}
else if (f[newMsk].ff == f[msk].ff) {
minimize(f[newMsk].ss, f[msk].ss + a[i]);
}
}
else {
if (f[newMsk].ff > f[msk].ff + 1) {
f[newMsk].ff = f[msk].ff + 1;
f[newMsk].ss = a[i];
}
else if (f[newMsk].ff == f[msk].ff + 1) {
minimize(f[newMsk].ss, a[i]);
}
}