結果
| 問題 |
No.545 ママの大事な二人の子供
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-22 11:52:38 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,921 bytes |
| コンパイル時間 | 1,324 ms |
| コンパイル使用メモリ | 80,152 KB |
| 最終ジャッジ日時 | 2025-02-12 13:00:09 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 WA * 6 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void halr_sum(vector<long long int> &a,vector<long long int> &b,int temp_sum,int i,int end, vector<long long int> &sum){
if(i==end){
sum.push_back(temp_sum);
return;
}
halr_sum(a,b,temp_sum+a[i],i+1,end,sum);
halr_sum(a,b,temp_sum-b[i],i+1,end,sum);
}
int main(){
int n;
cin >> n;
vector<long long int> a(n),b(n);
for(int i=0; i<n; i++){
cin >> a[i]>>b[i];
}
// Sum_i in Select (a[i]) とSum_i in Not Select (b[i])の
// 差の絶対値の最小値を求める
// 1<=n<=32
// 0<=a[i],b[i]<=5*10^9
// 単純に計算すると2^32=2^10*3 *4 =4* 10^9 なので間に合わない.
// なお,2^16 = 64*1000=6*10^4である.
// 従って,グループを2グループに分け,それぞれで全通りで差を計算する.(半分全列挙)
// この時,差について各 -\inf ~ 0 | \inf がある.
// 従って,各上,下から確かめれば良い.
if (n==1){
cout << min(a[0],b[0]) << endl;
return 0;
}
int lc=n/2,rc=n-lc;
vector<long long int> l(lc),r(rc);
vector<long long int> lsum,rsum;// それぞれありうる合計値の差異のリスト.
halr_sum(a,b,0,0,lc,lsum);
halr_sum(a,b,0,lc,n,rsum);
sort(lsum.begin(),lsum.end());
sort(rsum.begin(),rsum.end());
long long int ans=5*(long long int)1000000000*32;// lsum,rsumの合計の絶対値最小になる時の値を探す.
int j=rsum.size()-1;
long long int temp=ans;
for(int i=0;i<lsum.size();i++){
temp=lsum[i]+rsum[j];
ans=min(ans,abs(temp));
while(temp>0 && j>0){
j--;
temp=lsum[i]+rsum[j];// jを下げていくとtempは減少する.
ans=min(ans,abs(temp));
}
}
cout << ans << endl;
return 0;
}