Прогрессивный торг

Финеас Барнум предложил Филиппу Карлайлу перспективное место работы в цирке. Эта работа непроста и сопряжена с некоторыми рисками, но мистера Карлайла заверили, что именно здесь он получит бесценный жизненный опыт. После долгих уговоров и большого количества аргументов мистер Карлайл готов был согласиться, но тут встал вопрос о деньгах.

Мистер Барнум готов заплатить мистеру Карлайлу x (история умалчивает чего), но тот ценит свой труд больше, и хочет получать y. Узнав об этом, мистер Барнум решил сторговаться и увеличил свое предложение на a. Мистер Карлайл пошел ему навстречу, и уменьшил свое предложение на b. После этого мистер Барнум поднял свое предложение на 2⋅a, затем мистер Карлайл уменьшил свое предложение на 2⋅b, затем мистер Барнум увеличил свое на 3⋅a, и так далее...

Как только очередное предложение, которое хочет назвать мистер Барнум становится больше или равно последнему предложению мистера Карлайла, или же сумма, которую хочет назвать мистер Карлайл, меньше или равна той, которую только что назвал мистер Барнум, торг заканчивается на последней названной сумме. Ваша задача — определить эту сумму.

Входные данные В первой строке содержится единственное число t — количество тестов (1≤t≤2⋅103).

Далее следуют t строк, каждая из которых соответствует отдельному тесту. Каждый тест задан четырьмя целыми числами x,y,a,b (1≤x,y≤1012,1≤a,b≤106) — суммы, с которых начинали торг Финеас Барнум и Филипп Карлайл, и их первый шаг в торге соответственно. Гарантируется, что x≤y.

Выходные данные Для каждого теста в отдельной строке выведите по одному число — сумму, на которой договорятся мистер Барнум и мистер Карлайл. Мой код выдает неправильный ответ на 2 блоке с тестами, не знаю в чем ошибка

#define int long long 
using namespace std;
signed main() {
    int x,y,a,b,res,m,t,bestm,i;
    cin >> t;
    vector<int> ans;
    for(i = 0; i < t; i++) {
    cin>> x >> y >> a >> b;
    int l = 0,r = y;
    res = 10e8;
    while(l + 1 != r) {
        m = (l + r)/2;
        
        if(y - m*b < 0) r = m;
        else {
            if(res > abs(x + m*a - y + m*b) and y - m*b <= x + m*a) {
                res = abs(y - m*b - x - m*a);
                r = m;
            } else l = m;
        }
    }
    if(x == y) ans.push_back(x);
    else ans.push_back(max(x+r*a,y-r*b));
    }
    for(i = 0; i < ans.size(); i++) cout << ans[i] << " ";
}

Ответы (1 шт):

Автор решения: MBo

Вы ищете количество полных шагов m, когда оба спекулянта сделали свои предложения, а консенсус может быть достигнут на шагах

x + m*a   vs   y - (m-1)*b   //Барнум поднял, полушаг
x + m*a   vs   y - m*b       //Карлайл опустил, полный шаг

И поиск вроде как не нужен, шаг вычисляется арифметически и один раз уточняется.

→ Ссылка