Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75

Задача "Одинокое число"

04.07.2024, 18:04. Показов 1466. Ответов 17

Студворк — интернет-сервис помощи студентам
Это интерактивная задача.

Однажды Лере было нечего делать, и она записала на листе бумаги N целых чисел:
a1,a2,…,aN. Лера недавно изучила алгоритмы сортировки, поэтому она выписала свои числа в неубывающем порядке, то есть
a1≤a2≤…≤aN.

Также Лера очень любит загадки, поэтому среди ее чисел есть некоторое число C, которое встречается среди выписанных чисел ровно один раз, а все остальные числа встречаются ровно два раза.

Лера загадала вам загадку — найти «одинокое» число C. Для этого вы можете не более, чем 42 раза попросить её сообщить вам i-е записанное число.

Лера также сообщила вам, что
1≤ai≤10^9


Примеры
Входные данные
5
1
1
4
5
5
Результат работы
? 1
? 2
? 3
? 4
? 5
! 4

Добавлено через 3 минуты
Моё решение. Валится на 4м тесте. Содержимое теста посмотреть нельзя.
Вручную проверял несколько вариантов с 5, 7, 9, 11, 13, 15 числами, везде выдаёт правильный ответ.

Подскажите, возможно, я какую-то ошибку не замечаю.

Кратко алгоритм:
Запросы всегда делаем для четного i. Запрашиваем два числа: a[i] и a[i+1].
Если a[i] == a[i+1], значит мы находимся слева от искомого числа.
Если a[i] != a[i+1], значит либо мы находимся справа от искомого числа, либо a[i] - само искомое число.

Есть такая же задача без интерактива на C++:
Найти «одинокое» число

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def ask(x):
    global ans
    print('?', x, flush=True)
    ansL = input()
    print('?', x+1, flush=True)
    ansR = input()
    if ansL == ansR:
        return 1
    else:
        ans = ansL
        return -1
 
n = int(input())
 
if n==1:
    print('?', 1, flush=True)
    ans = input()
 
if n==3:
    print('?', 1, flush=True)
    ans1 = input()
    print('?', 2, flush=True)
    ans2 = input()
    print('?', 3, flush=True)
    ans3 = input()
    if ans1<ans2:
        ans=ans1
    if ans3>ans2:
        ans=ans3
if n>3:
    left = 1
    right = n
    while (right - left > 0):
        x = (left + right) // 2
        if x % 2 == 0:
            x += 1
        if ask(x) == -1: # загаданное число меньше x
            right = x - 1
        else: # загаданное число больше x
            left = x + 1
        # print ('left=',left)
        # print ('right=',right)
print ('!', ans)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2024, 18:04
Ответы с готовыми решениями:

Найти «одинокое» число
Однажды Маше было нечего делать, и она записала на листе бумаги N целых чисел: a1, a2, …, a N Маша недавно изучила алгоритмы...

Задача число и число записанное в обратном направлении сумма целого числа
ПОЖАЛУЙСТА помогите составить программу на соde::bloks c++,только начал учится в колегии после 10 лет перерыва между школой. Задача число...

Задача Дано целое число N (> 0). Найти сумму 1 + 1/2 + 1/3 + . + 1/N (вещественное число)
Доброе утро. Подскажите пожалуйста, правильно ли я решил задачу. Задача Дано целое число N (&gt; 0). Найти сумму 1 + 1/2 + 1/3 + ... +...

17
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
04.07.2024, 19:23
semen1984, Не совсем понял, в каком виде должен быть ответ. Но вот решение. На выходе искомое число.
Python
1
2
3
4
result = 0
for _ in range(int(input())):
    result ^= int(input())
print(result)
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
04.07.2024, 21:47
Цитата Сообщение от semen1984 Посмотреть сообщение
Если a[i] == a[i+1], значит мы находимся слева от искомого числа
Почему?

Добавлено через 1 минуту
Сорри, я туплю

Добавлено через 3 минуты
Тут кажется проблема в том, что
https://www.cyberforum.ru/cgi-bin/latex.cgi?2^{21} < 10^9
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 09:03  [ТС]
anton78spb,
Не совсем понял, в каком виде должен быть ответ.
вид: "! Искомое число"
например: ! 4

Но вот решение. На выходе искомое число.
Возможно, я что-то не до конца описал.

Вот примеры и ответы:

1 1 4 5 5
одинокое число - 4

1 1 2 2 3 3 6 6 7 7 8 11 11 14 14
одинокое число - 8

5 5 7 8 8 9 9 10 10
одинокое число - 7

1 1 2 2 3 3 7 9 9 10 10
одинокое число - 7

Добавлено через 2 минуты
Red white socks,
Тут кажется проблема в том, что
спасибо за ответ
я тоже думал об этом, но у меня есть ощущение, что я что-то другое упустил
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
05.07.2024, 09:16
а внятная/дословная формулировка задачи есть?
Цитата Сообщение от semen1984 Посмотреть сообщение
Примеры
Входные данные
5
1
1
4
5
5
Цитата Сообщение от semen1984 Посмотреть сообщение
Вот примеры и ответы:
1 1 4 5 5
одинокое число - 4
дуализм в мозгах какой-то
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 09:35  [ТС]
udmurt2024,
дуализм в мозгах какой-то
Это один из примеров:
Входные данные
5
1
1
4
5
5
Результат работы
? 1
? 2
? 3
? 4
? 5
! 4

Задача интерактивная, из олимпиадного программирования.

Более подробно:
Шаг 1: передаётся N (5)
Шаг 2: программа запрашивает 1е число последовательности (? 1)
Шаг 3: программа получает 1е число последовательности (1)
...
Шаг M: программа выдаёт одинокое число (! 4)

Не стал подробно расписывать на примерах с 5+ членами последовательностей.


Итого, задача на бинарный поиск с небольшим усложнением. Можно игнорировать этот интерактив.
Если кто-то подскажет, буду рад.
Спасибо.
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
05.07.2024, 09:46
Цитата Сообщение от semen1984 Посмотреть сообщение
задача на бинарный поиск
с каким условием?
Python
1
2
3
4
5
6
7
8
9
n=int(input())
a=[]
for i in range(1,n+1):
    print(f'?{i} ',end='')
    a.append(int(input()))
for i in range(0,n,2):
    if i==n-1 or a[i]!=a[i+1]:
        print(f'!{a[i]}')
        break
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
05.07.2024, 09:49
Цитата Сообщение от semen1984 Посмотреть сообщение
вид: "! Искомое число"
например: ! 4
А чем вас не устроило решение которое я выложил?
Задача "Одинокое число"
Отсутствием восклицательного знака перед ответом?

Вот "доработанное", с символами ? и !.
Python
1
2
3
4
result = 0
for i in range(int(input())):
    result ^= int(input(f"? {i + 1} "))
print("!", result)
1
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 10:11  [ТС]
anton78spb,
А чем вас не устроило решение которое я выложил?
Задача "Одинокое число"
Отсутствием восклицательного знака перед ответом?
Спасибо за Ваше решение.
Возможно я ошибаюсь, но по количеству запросов не пройдёт.
Их максимум должно быть 42. У Вашего решения на 50 числах уже будет больше запросов.

Бинарный поиск позволяет существенно сократить их количество.

Добавлено через 8 минут
udmurt2024,
с каким условием?

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

Пример:
1 1 2 2 3 3 6 6 7 7 8 11 11 14 14

Input/Output для 15 чисел:
15
?9
7
?10
7
?13
11
?14
14
?11
8
?12
11
!8


условие поиска: найти первый (самый "левый") случай: a[i] != a[i+1] при нечётных а, если считаем, что первый элемент с номером "один"
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
05.07.2024, 10:24
Python
1
2
3
4
5
6
7
n=int(input())
for i in range(n):
    a=int(input(f'?{i+1} '))
    if i%2 and a!=b or i==n-1:
        print(f'!{a if i==n-1 else b}')
        break
    b=a
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 10:29  [ТС]
udmurt2024,
в этом случае тоже будет перебор запросов (? Х)
эту задачу точно бинарным поиском нужно решать
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
05.07.2024, 10:36
semen1984, как дословно сформулирована задача?
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 10:45  [ТС]
udmurt2024,
Однажды Лере было нечего делать, и она записала на листе бумаги N целых чисел:
a1,a2,…,aN. Лера недавно изучила алгоритмы сортировки, поэтому она выписала свои числа в неубывающем порядке, то есть
a1≤a2≤…≤aN.

Также Лера очень любит загадки, поэтому среди ее чисел есть некоторое число C, которое встречается среди выписанных чисел ровно один раз, а все остальные числа встречаются ровно два раза.

Лера загадала вам загадку — найти «одинокое» число C. Для этого вы можете не более, чем 42 раза попросить её сообщить вам i-е записанное число.

Лера также сообщила вам, что
1≤ai≤10^9
0
231 / 172 / 71
Регистрация: 14.06.2024
Сообщений: 468
05.07.2024, 10:56
Цитата Сообщение от semen1984 Посмотреть сообщение
Входные данные
5
это откуда по задаче?

Python
1
2
3
4
5
6
for i in range(42):
    a=int(input(f'?{i+1} '))
    if i%2 and a!=b:
        print(f'!{b}')
        break
    b=a
1
88 / 32 / 14
Регистрация: 25.03.2023
Сообщений: 69
05.07.2024, 10:59
Это не задача а мучение какое то)))
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 11:15  [ТС]
udmurt2024,
это откуда по задаче?
на вход подаётся N - количество членов последовательности
в качестве примера выбрано число 5
в явном виде ограничений на N не прописано, предлагаю считать N < 10^3
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
05.07.2024, 11:25
Цитата Сообщение от semen1984 Посмотреть сообщение
Спасибо за Ваше решение.
Возможно я ошибаюсь, но по количеству запросов не пройдёт.
Пожалуйста. Думаю, что в данном случае вы ошибаетесь.
В условии сказано:
Цитата Сообщение от semen1984 Посмотреть сообщение
Для этого вы можете не более, чем 42 раза попросить её сообщить вам i-е записанное число.
Алгоритм представленный выше запрашиваем i-е число ровно ОДИН раз, при вводе. Он даже не хранит их.
Цитата Сообщение от semen1984 Посмотреть сообщение
Бинарный поиск позволяет существенно сократить их количество.
Данную задачу можно решить без использования бинарного поиска, более быстрым вариантом, который я написал выше.
Цитата Сообщение от semen1984 Посмотреть сообщение
Моё решение. Валится на 4м тесте.
Все просто. Подставьте мое решение в проверяющую систему, и напишите результат. Интересно узнать его.
0
9 / 7 / 2
Регистрация: 07.05.2024
Сообщений: 75
05.07.2024, 13:26  [ТС]
anton78spb,
Алгоритм представленный выше запрашиваем i-е число ровно ОДИН раз, при вводе. Он даже не хранит их.
Извиняюсь, если запутал Вас.
Решение не предполагает ввод всех чисел последовательности. Мы гарантированно не узнаем всего ряда при достаточно больших N.
Мы можем спросить максимум 42 раза. Учитывая, что каждый раз нужно спрашивать пару, то и вовсе "полезных" запросов может оказаться меньше.

Для чистоты эксперимента я подставил Ваше решение. Ошибка на первом тесте. Специфика этой проверяющей системы в том, что не видно тестовые сценарии.
Моё решение доходит до 4 теста и тоже валится с ошибкой.

Добавлено через 1 час 47 минут
спасибо за помощь, нашёл ошибку!

ошибка в моём решении - не обработал исключительную ситуацию выхода за пределы последовательности справа, спрашивал несуществующий элемент N+1
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.07.2024, 13:26
Помогаю со студенческими работами здесь

Задача Дано вещественное число A и целое число N (> 0). Вывести 1 – A + A2 – A3 + . + (–1)N*AN
Здравствуйте, помогите пожалуйста решить задачу используя циклы. Дано вещественное число A и целое число N (&gt; 0). Вывести 1 – A +...

Задача python / pascal: В первой строке программе подается на вход число натуральное число n, не превышающее 1000
В аркадной компьютерной игре звездный истребитель может выполнить одну из пяти команд. Команды игрока компьютеру подаются вместе с блоком...

Задача трехзначное число. В нем зачеркнули первую слева цифру и приписали ее справа. Вывести полученное число
на языке си решите ))

Задача Римское число
Создайте класс Roman (РимскоеЧисло), представляющий римское число и поддерживающий операции +, -, *, /. При реализации класса следуйте...

Задача 1. «Число в конец»
Задание: Создать список/массив из 10 натуральных чисел и добавить в его конец сумму этих чисел. Пример работы программы: изображен на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru