#include #include #include #include #include #include #include #include #include #include #define ALL(variable) (variable).begin(), (variable).end() #define GT(variableName, defaultValue, limit) for(int variableName = defaultValue; variableName < (int)limit; variableName++) #define GTE(variableName, defaultValue, limit) for(int variableName = defaultValue; variableName <= (int)limit; variableName++) #define LT(variableName, defaultValue, limit) for(int variableName = defaultValue; variableName > (int)limit; variableName--) #define LTE(variableName, defaultValue, limit) for(int variableName = defaultValue; variableName >= (int)limit; variableName--) using namespace std ; int main(){ long long n, answer; cin >> n; answer = LLONG_MAX; vector A(n), B(n); GT(i, 0, n){ cin >> A[i] >> B[i]; } vector upA(0), loA(0); GT(i, 0, pow(2, n/2)){ long long memo = 0, _i = i; GT(j, 0, n/2) { if(_i%2 == 0){ memo += A[j]; } else{ memo -= B[j]; } _i = i>>1; } upA.push_back(memo); } GT(i, 0, pow(2, n-n/2)){ long long memo = 0, _i = i; GT(j, 0, n-n/2) { if(_i%2 == 0){ memo += A[j+n/2]; } else{ memo -= B[j+n/2]; } _i = i>>1; } loA.push_back(memo); } sort(ALL(upA)); sort(ALL(loA)); GT(i, 0, loA.size()){ int lowerUpi = lower_bound(ALL(upA), -loA[i])-upA.begin(); int lowerUpMins1i = 0; if(lowerUpi >= upA.size()){ lowerUpi--; } if(lowerUpi != 0){ lowerUpMins1i = lower_bound(ALL(upA), -loA[i])-1-upA.begin(); } long long _ = min(abs(loA[i] + upA[lowerUpi]), abs(loA[i] + upA[lowerUpMins1i])); answer = min(answer, _); } cout << answer << endl; return 0; }