Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249

Олимпиадная задача с тимуса №1209

01.07.2014, 11:29. Показов 2850. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ограничение времени: 1.0 секунды
Ограничение памяти: 64 МБ

Представим себе бесконечную последовательность цифр, составленную из записанных друг за другом возрастающих степеней десятки. Вот начало этой последовательности: 110100100010000… Всё, что надо — определить, какая цифра находится в такой последовательности на определённом месте.

Исходные данные
В первой строке находится целое число N (1 ≤ N ≤ 65535). В i-й из N последующих строк записано целое число Ki — номер позиции в последовательности (1 ≤ Ki ≤ 2^31 − 1).

Результат
Выведите через пробел N цифр. i-я цифра должна равняться цифре, которая находится в описанной выше последовательности на позиции с номером Ki.

Пример
исходные данные
4
3
14
7
6
результат
0 0 1 0

Мое решение:
C++
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
#include <iostream>
using std::cin;
using std::cout;
 
#define U unsigned int
#define U64 unsigned __int64
 
int main()
{
    U n;
    U64 tek;
    char res[65535];
 
    cin >> n; // количество тестов
    for (U i = 0; i < n; i++)
    {
        cin >> tek; // вводим номер позиции
        for (U64 j = 1; n - j > 0; j++) // пока возможно, отнимаем количество цифр в числах, которые были до текущего
            tek -= j;                   // например, при tek = 10 отнимаем 1 (первое число 1), 2 (второе число 10), 3 (третье число 100) и т.д.
        res[i] = (tek == 1? '1' : '0'); // если после этого нам нужна первая позиция, то нужная цифра - 1, иначе 0
    }
    
    for (int i = 0; i < n; i++)
        cout << res[i] << " ";
    return 0;
}
Ошибка на втором же тесте. В чем дело?

Добавлено через 1 минуту
Цитата Сообщение от Керра Посмотреть сообщение
for (U64 j = 1; n - j > 0; j++)
Затупила тут - очевидно, что должно быть tek - j > 0

Добавлено через 1 минуту
Но теперь почему-то Time limit exceeded

Добавлено через 7 минут
C++
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
#include <iostream>
using std::cin;
using std::cout;
 
#define U unsigned int
#define U64 unsigned __int64
 
int main()
{
    U n;
    U64 tek;
    char res[65535];
 
    cin >> n; // количество тестов
    for (U i = 0; i < n; i++)
    {
        cin >> tek; // вводим номер позиции
        for (U64 j = 1; tek > j; j++) // пока возможно, отнимаем количество цифр в числах, которые были до текущего
            tek -= j;                   // например, при tek = 10 отнимаем 1 (первое число 1), 2 (второе число 10), 3 (третье число 100) и т.д.
        res[i] = (tek == 1? '1' : '0'); // если после этого нам нужна первая позиция, то нужная цифра - 1, иначе 0
    }
    
    for (int i = 0; i < n; i++)
        cout << res[i] << " ";
    return 0;
}
Это уже лучше, но все равно превышение лимита по времени на 3м тесте
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2014, 11:29
Ответы с готовыми решениями:

Задача с тимуса
совсем недавно в программировании встретилась задачка с тимуса 1295 проблема в том что в ней используются очень большие числа. и что делать...

задача с Тимуса
http://acm.timus.ru/problem.aspx?space=1&amp;num=1192

задача с Тимуса
http://acm.timus.ru/problem.aspx?space=1&amp;num=1123 Задача на зачет нужна :scratch:

13
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
01.07.2014, 13:35
Керра, лучше сначала заполнить массив, а потом производить поиск.
Так думаю будет быстрее.
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
01.07.2014, 13:56  [ТС]
GuGo1991, для входных данных я вообще массив не использую. А как дополнительные действия могут ускорить программу?
И вообще проблема во вложенном цикле. Известно, что есть какая-то формула, которая сразу что-то вычисляет, без цикла. Но эту формулу я не могу ни найти, ни придумать.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
01.07.2014, 13:59
Я предлагаю решение вообще в другом ключе: вычисляйте позиции 1 и 0. Так как с каждым увеличением разряда прибавляется только один 0.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int GetDigit(const int pos)
{
  int delta = 0;
  int start = 1; // позиция 1
  int end = 1;  // конец числа
  while pos not in [start..end]
  {
     delta++;
     start = end + 1;
     end = start + delta;
  }
  if pos == start return 1;
  else return 0;
}
1
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
01.07.2014, 14:32
Керра, формула кажется эта k(k + 1) / 2 + k + 2, поиск точного квадрата.
Должно работать:
C++
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
#include <iostream>
#include <cmath>
#include <conio.h>
 
char value(int index)
{
    if(index == 1) return '1';
    double k;
    k = floor(sqrt(9.0 - 4.0 * (4.0 - 2.0 * index)));
    if(k * k == 9.0 - 4.0 * (4.0 - 2.0 * index)) return '1';
    return '0';
}
 
int main()
{
    int n, index;
    std::string result;
    std::cin >> n;
    while(n > 0)
    {
        std::cin >> index;
        result += value(index);
        result += ' ';
        n--;
    }
    
    std::cout << result;
    
    std::cout << "\nOperation succeeded\n";
    getch();
    return 0;
}
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.07.2014, 14:53
Если
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{8k-7}-1)/2
целое, то на позиции k - единица
если нет - то 0
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
01.07.2014, 15:24  [ТС]
IrineK, вот откуда эта формула, и почему там какое-то 8, по какой логике это работает?
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.07.2014, 15:48
Лучший ответ Сообщение было отмечено HighPredator как решение

Решение

Керра,
Работает?

Добавлено через 14 минут
Рассмотрим строку
11010010001000 и т.д.
пока будем нумеровать с 0
Единицы стоят на позициях
0 = 0
0+1= 1
0+1+2 = 3
0+1+2+3 = 6
0+1+...+n = n(n+1) / 2
Пусть k - позиция единицы, т.е. n(n+1) / 2 = k
Найдем соответствующее n, решив квадратное уравнение

n^2 + n - 2k = 0
D = 1 + 8k (вот и 8)
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (-1\pm \sqrt{1+8k})/2
Поскольку n>=0
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{1+8k}-1)/2

Теперь внесем поправку на нумерацию k не от 0, а с 1
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{1+8(k-1)}-1)/2
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{8k-7}-1)/2
3
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
01.07.2014, 15:58

Не по теме:

я вообще в шоке с таких заданий, особенно после 3 часов сна, откуда вы эти формулы берёте...


быдлокод и вроде работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
int main()
{
  int y;
  cin>>y;
  char s;
  for(int i=0;i<y;)
    {
      s='1';
      i++;
      int t=i;
      if(i==y)
          break;
      for(int j=0;j<t-1;j++,i++)
        {
        s='0';
        if(i==y)
          break;
        }
    }
cout<<s;
}
Добавлено через 2 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
Рассмотрим строку
11010010001000 и т.д.
пока будем нумеровать с 0
Единицы стоят на позициях
0 = 0
0+1= 1
0+1+2 = 3
0+1+2+3 = 6
0+1+...+n = n(n+1) / 2
Пусть k - позиция единицы, т.е. n(n+1) / 2 = k
Найдем соответствующее n, решив квадратное уравнение
n^2 + n - 2k = 0
D = 1 + 8k (вот и 8)
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (-1\pm \sqrt{1+8k})/2
Поскольку n>0
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{1+8k}-1)/2
Теперь внесем поправку на нумерацию k не от 0, а с 1
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{1+8(k-1)}-1)/2
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{8k-7}-1)/2
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
01.07.2014, 19:17  [ТС]
IrineK, благодарю
0
Заблокирован
01.07.2014, 19:21
Цитата Сообщение от IrineK Посмотреть сообщение
Теперь внесем поправку на нумерацию k не от 0, а с 1
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{1+8(k-1)}-1)/2
https://www.cyberforum.ru/cgi-bin/latex.cgi?n = (\sqrt{8k-7}-1)/2
Математические подход есть, но формула выведена не правильно, относительно поправки. Поправки не делают методом "тыка", вдруг сработает, делая неочевидные вещи.
Изначально надо было решать уравнение -
k=(n*(n-1))/2 +1.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.07.2014, 19:25
Цитата Сообщение от Trwsdf Посмотреть сообщение
Изначально надо было решать уравнение -
k=(n*(n-1))/2 +1.
Была решена система
К=(n*(n+1))/2
К = k-1

Неочевидно?
0
Заблокирован
01.07.2014, 19:37
Цитата Сообщение от IrineK Посмотреть сообщение
Была решена система
К=(n*(n+1))/2
К = k-1
Неочевидно?
вы забыли что у вас в уравнении стоит n+1, а это совсем другое уравнение. Но решение вы угадали да.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
01.07.2014, 19:39
Ну дай бог мне и дальше угадывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2014, 19:39
Помогаю со студенческими работами здесь

Задача с тимуса
Вот задача с тимуса, возникли с ней проблемы.Я знаю, что на форуме уже есть решение, но всё-таки хотелось бы узнать ошибку в своём кода. ...

Задача с Тимуса 1446
Всем привет. Я несколько дней бился над задачей с Тимуса. Вот ссыль: вырезано Задача не сложная - просто ввести строки, например, в 4...

Задача с тимуса №1881
http://acm.timus.ru/problem.aspx?space=1&amp;num=1881 #include &lt;iostream&gt; using std::cin; using std::cout; int main() { int...

Задача с тимуса про сороконожку
У сороконожки 40 левых ножек и 40 правых ножек. Под кроватью у сороконожки a левых тапочек и b правых тапочек. Сороконожка, просыпаясь,...

Предохранители. Задача с тимуса №1327
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ Янус Полуэктович (не помню уже, А или У) воспользовался машиной только...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru