結果
| 問題 |
No.545 ママの大事な二人の子供
|
| ユーザー |
gigime
|
| 提出日時 | 2017-07-14 22:37:16 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 24 ms / 2,000 ms |
| コード長 | 1,070 bytes |
| コンパイル時間 | 1,789 ms |
| コンパイル使用メモリ | 174,660 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-07 23:40:53 |
| 合計ジャッジ時間 | 3,112 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,l,r) for(int i = (int) (l);i < (int) (r);i++)
template<typename T> bool chmax(T& a,const T& b){ return a < b ? (a = b,true) : false; }
template<typename T> bool chmin(T& a,const T& b){ return b < a ? (a = b,true) : false; }
typedef long long ll;
int N;
vector<ll> A,B;
const ll INF = 1e18;
int main()
{
scanf("%d",&N);
A.assign(N,0);
B.assign(N,0);
FOR(i,0,N){
scanf("%lld%lld",&A [i],&B [i]);
}
int half = N / 2;
vector<ll> v;
FOR(mask,0,1 << half){
ll sum = 0;
FOR(i,0,half){
if(mask >> i & 1){
sum += A [i];
}
else{
sum -= B [i];
}
}
v.push_back(sum);
}
sort(v.begin(),v.end());
ll ans = INF;
FOR(mask,0,1 << (N - half)){
ll sum = 0;
FOR(i,0,(N - half)){
if(mask >> i & 1){
sum += A [i + half];
}
else{
sum -= B [i + half];
}
}
auto it = lower_bound(v.begin(),v.end(),-sum);
if(it != v.end()){
chmin(ans,abs(sum + *it));
}
if(it != v.begin()){
chmin(ans,abs(sum + *(--it)));
}
}
printf("%lld\n",ans);
return 0;
}
gigime