結果
問題 | No.545 ママの大事な二人の子供 |
ユーザー |
|
提出日時 | 2017-07-14 23:21:12 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 31 ms / 2,000 ms |
コード長 | 3,420 bytes |
コンパイル時間 | 1,980 ms |
コンパイル使用メモリ | 186,016 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-07 23:53:35 |
合計ジャッジ時間 | 3,208 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 32 |
ソースコード
#ifdef _MSC_VER# define _CRT_SECURE_NO_WARNINGS# define _USE_MATH_DEFINES# include <intrin.h># define __builtin_popcount __popcnt#endif#include <bits/stdc++.h>using namespace std;using i32 = int; using i64 = long long int; using f64 = double;using u32 = unsigned int; using u64 = unsigned long long int; using str = string;template <typename T> using vec = vector<T>; void in() { }template <typename T, typename...TS> void in(T &&x, TS &&...xs) { cin >> x; in(move(xs)...); }template <typename T> void out(T &&x) { cout << x << "\n"; }template <typename T, typename...TS> void out(T &&x, TS &&...xs) { cout << x << " "; out(move(xs)...); }#define indef(t, ...) t __VA_ARGS__; in(__VA_ARGS__)#define get(t) []{ t x; cin >> x; return x; }()#define times(n, i) for (i32 i = 0; i < (n); ++i)#define range(a, b, i) for (i32 i = (a); i < (b); ++i)#define upto(a, b, i) for (i32 i = (a); i <= (b); ++i)#define downto(a, b, i) for (i32 i = (a); i >= (b); --i)#define all(xs) (xs).begin(), (xs).end()#define sortall(xs) sort(all(xs))#define reverseall(xs) reverse(all(xs))#define even(x) ((abs(x) & 1) == 0)#define odd(x) ((abs(x) & 1) == 1)#define bit(x, i) (((x) >> i) & 1)#define append emplace_back#define bisect_left lower_bound#define bisect_right upper_bound#define bound(a, x, b) (a <= x && x <= b)const i64 MOD = 1000000007ll;const f64 EPS = 1e-10;i64 a[32], b[32];void solve() {indef(i32, n);times(n, ni) {in(a[ni], b[ni]);}if (n == 1) {out(min(a[0], b[0]));return;}vec<pair<i64,i64>> fr;i32 m = n/2;times(1<<m, i) {i64 at = 0, bt = 0;times(m, j) {if (bit(i, j)) {at += a[j];}else {bt += b[j];}}fr.append(make_pair(at, bt));}vec<tuple<i64, i64, i64>> ba;i32 k = n-m;times(1<<k, i) {i64 at = 0, bt = 0;times(k, j) {if (bit(i, j)) {at += a[m+j];}else {bt += b[m+j];}}ba.append(make_tuple(at - bt, at, bt));}sortall(ba);i64 ansa, ansb, ansd = LLONG_MAX;for (auto p : fr) {i64 at = p.first;i64 bt = p.second;i64 d = at - bt;auto it = bisect_left(all(ba), make_tuple(-d, 0, 0));upto(-2, 2, o) {if (o < 0 && distance(ba.begin(), it) >= -o) {i64 aat, bbt, dd;tie(dd, aat, bbt) = *(it + o);if (abs(d + dd) < ansd) {ansa = at + aat;ansb = bt + bbt;ansd = abs(d + dd);}}else if (o >= 0 && distance(it, ba.end()) > o) {i64 aat, bbt, dd;tie(dd, aat, bbt) = *(it + o);if (abs(d + dd) < ansd) {ansa = at + aat;ansb = bt + bbt;ansd = abs(d + dd);}}}}out(ansd);}i32 main(){ios::sync_with_stdio(false);#ifdef _MSC_VER/**ifstream fin("input.txt"); cin.rdbuf(fin.rdbuf()); assert(fin);ofstream fout("output.txt"); cout.rdbuf(fout.rdbuf()); assert(fout);/**/#endifcout << fixed << setprecision(9);solve();return 0;}