제출 #884574

#제출 시각아이디문제언어결과실행 시간메모리
884574AnhPhamBali Sculptures (APIO15_sculpture)C++17
0 / 100
14 ms1112 KiB
#include <bits/stdc++.h> #ifdef OP_DEBUG #include <algo/debug.h> #else #define debug(...) 26 #endif using namespace std; #define int long long // maybe tle? #define sz(v) (int)(v).size() #define all(v) (v).begin(), (v).end() #define TcT template <class T const int MOD = (int)1e9 + 7, INF = (int)2e9 + 9, INF64 = (int)4e18 + 18; TcT> bool minimize(T &lhs, const T &rhs) { return rhs < lhs ? lhs = rhs, 1 : 0; } TcT> bool maximize(T &lhs, const T &rhs) { return rhs > lhs ? lhs = rhs, 1 : 0; } TcT, class S> istream &operator >> (istream &scanf, pair <T, S> &u) { return scanf >> u.first >> u.second; } TcT, class S> ostream &operator << (ostream &print, pair <T, S> &u) { return print << u.first << ' ' << u.second; } void solve(); int32_t main() { cin.tie(nullptr), cout.tie(nullptr) -> sync_with_stdio(0); int testcases = 1; #define TC 0 if (TC) { cin >> testcases; } for (; testcases--;) { solve(); } } /* [Pham Hung Anh - 11I - Tran Hung Dao High School for Gifted Student] */ const int N = 2002; int n, a, b; int y[N]; namespace sub1 { int ans = INF; void Try(int k, int parts, int sum, int sum_or) { if (k > n) { if (a <= parts && parts <= b) minimize(ans, sum_or | sum); return; } Try(k + 1, parts, sum + y[k], sum_or); Try(k + 1, parts + 1, y[k], sum_or | sum); } void solve() { Try(1, 1, 0, 0); cout << ans << '\n'; } } namespace sub2 { // max ans = 500? bool dp[55][22][505]; // xét đến i, đoạn thứ parts, tổng or là sum_or void solve() { dp[0][0][0] = 1; for (int i = 1; i <= n; ++i) for (int parts = 0; parts <= b; ++parts) for (int sum_or = 0; sum_or <= 500; ++sum_or) { int sum = 0; for (int j = i; j >= 1; --j) dp[i][parts + 1][sum_or | (sum += y[j])] |= dp[j - 1][parts][sum_or]; } int ans = INF; for (int parts = a; parts <= b; ++parts) for (int sum_or = 0; sum_or <= 500; ++sum_or) if (dp[n][parts][sum_or]) minimize(ans, sum_or); cout << ans << '\n'; } } void solve() { cin >> n >> a >> b; for (int i = 1; i <= n; ++i) cin >> y[i]; if (n <= 20) sub1 :: solve(); else if (n <= 50) sub2 :: solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...