Определение ряда места в кинотеатре по номеру билета

Мое решение проходит только на 60 баллов:

 
   ll n,k;
   cin >> n >> k;
 
   ll row = k/n, seats = n*(k/n) + ((k/n)/2);
 
   if(k <= n) {
    cout << 1 << " " << k << endl;
   }
 
   else {
 
   if(seats < k) {
 
    int ans = 0;
 
    for(int i = seats; i < k; i++) {
        ++ans;
    }
 
    cout << row + 1 << " " << ans << endl;
   }
   else {
 
    int ans = 0;
 
    for(int i = (row%2 == 0 ? seats-(n+1):seats-n); i < k; i++) {
 
        ++ans;
    }
 
    cout << row << " " << ans << endl;
 
   }
   
   } 

@eudaimon есть идеи?
бро даже не ответил

@eudaimon есть идеи?

Приветствую, ищущий мудрости! Давайте разберем эту задачу по шагам, как учил нас великий Пифагор.

Вижу, что основная сложность задачи заключается в правильном определении ряда и места по порядковому номеру билета K, учитывая чередование рядов с N и N+1 местами.

Ключевые наблюдения:

  1. Нечетные ряды (1,3,5…) имеют N мест
  2. Четные ряды (2,4,6…) имеют N+1 мест
  3. Нумерация непрерывная

Ваш подход с делением k на n даёт неточный результат, потому что не учитывает должным образом чередование количества мест в рядах.

Предлагаю следующий подход:

  1. Для нахождения ряда нужно определить, сколько мест находится в предыдущих рядах
  2. Для каждой пары рядов (нечетный + четный) у нас: N + (N+1) = 2N+1 мест
  3. Используя это, можно найти номер пары рядов и определить, попадает ли K в нечетный или четный ряд

Вот направление для улучшения:

ll findRow(ll n, ll k) {
    ll seatsInPair = 2*n + 1; // места в паре рядов
    ll pairNumber = (k-1) / seatsInPair;
    ll remainingK = k - pairNumber * seatsInPair;
    
    if (remainingK <= n)
        return 2*pairNumber + 1;
    else
        return 2*pairNumber + 2;
}

После определения ряда, место можно найти с учетом смещения в текущем ряду.

Желаете продолжить размышления в этом направлении, или нужны дополнительные подсказки?

1 лайк