5 / 5 / 1
Регистрация: 21.02.2019
Сообщений: 38
1

Получить счастливый билет перестановками

22.10.2020, 09:49. Показов 1382. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Решаю задачи на тему переборных алгоритмов и разветвленной рекурсии. Вот условие одной из задач, которая поставила меня в затруднение:
Счастливым билетиком называется такой билетик, у которого сумма цифр левой половины номера совпадает с суммой цифр правой половины. Например, билетик с номером 447294
является счастливым, т.к. 4 + 4 + 7 = 2 + 9 + 4 = 15. А билетик с номером 123456 счастливым
не является, т.к. 1 + 2 + 3 = 6 6= 15 = 4 + 5 + 6.
Вам дан номер некоторого билетика и необходимо определить можно ли переставить
цифры в его номере таким образом, чтобы билетик стал счастливым.

1234
YES
1423

001234
YES
140023

447294
YES
447294

123456
NO

Появилась мысль на счет того, чтобы отсортировать массив цифр и разбить его на пары от начала до конца, в каждой из которых посчитать разность, далее также отсортировать массив разностей и снова посчитать разности и т.д. Причем наблюдать какие цифры относятся к каким разностям и разделять таким образом цифры в каждой из изначальных пар в два множества цифр - левую и правую части. Не факт, что метод работает, но на нескольких примерах я его уже проверил.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2020, 09:49
Ответы с готовыми решениями:

Счастливый билет!
билет с шестизначным номером считается счастливым если сумма трех старших цифр совпадает с суммой...

счастливый билет
нам дается номер билета ,нужно проверить ,если мы будем разделять этот номер ,сумма цифр до раздела...

Счастливый билет
Всем привет помогите с решением задачи.Вводится шестизначное число .Определить является ли билет с...

счастливый билет
Вводится шестизначное число .Определить является ли билет с этим номером счастливым ?с оптимизацией...

2
Модератор
Эксперт по электронике
8475 / 4334 / 1642
Регистрация: 01.02.2015
Сообщений: 13,455
Записей в блоге: 8
22.10.2020, 10:05 2
Если количество цифр в номере небольшое, то решайте методом полного перебора во вложенных циклах (или их эквивалентах - в рекурсивных вызовах).
0
5 / 5 / 1
Регистрация: 21.02.2019
Сообщений: 38
22.10.2020, 11:14  [ТС] 3
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Извините, забыл ограничения на входные данные прикрепить
В единственной строке входного файла записан номер билетика T (10 ≤ T < 10^18). Гарантируется, что запись числа T содержит чётное количество цифр, однако, может содержать
ведущие нули. При определении длины номера ведущие нули следует учитывать.

Отсюда видно, что на полный перебор может уйти порядка https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{18!}{9!} операций, что конечно не впишется в разумные пределы времени работы программы

Добавлено через 53 минуты
Извините, если кого-то потревожил понапрасну, задача уже решена, получилось экспоненциальное решение 2 в степени n / 2, где n - количество цифр в числе

Код для будущих поколений:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <bits/stdc++.h>
 
//#define DEBUG
 
#ifdef DEBUG
#define logmsg(...) __VA_ARGS__
#define starttime clock_t t = clock()
#define stoptime t = clock() - t; cout << endl << "time: " << float(t) / CLOCKS_PER_SEC << endl
#else
#define logmsg(...)
#define starttime
#define stoptime
#endif // DEBUG
 
using namespace std;
 
string s;
 
bool bf(vector<pair<int, int>>& v, int n) {
    if ((n + 1) == s.size() / 2) {
        int cntl = 0, cntr = 0;
        for(auto p: v) {
            cntl += p.first;
            cntr += p.second;
        }
        if(cntl == cntr)
            return true;
        else
            return false;
    }
    if(bf(v, n + 1))
        return true;
    else {
        swap(v[n].first, v[n].second);
        if(bf(v, n + 1))
            return true;
        else
            return false;
    }
}
 
int sumdig(string::iterator begin, string::iterator end) {
    int sum = 0;
    while(begin != end) {
        sum += *begin - '0';
        begin++;
    }
    return sum;
}
 
vector<pair<int, int>> numtovec() {
    vector<int> t;
    for(char c: s) {
        t.push_back(c - '0');
    }
    sort(t.begin(), t.end(), greater<int>());
    vector<pair<int, int>> ans;
    for(int i = 0; i < s.size(); i += 2) {
        ans.emplace_back(t[i], t[i + 1]);
    }
    return ans;
}
 
void solve(){
    if(sumdig(s.begin(), s.end()) % 2) {
        cout << "NO";
        return;
    }
    vector<pair<int, int>> v = numtovec();
    if(bf(v, 0)) {
        cout << "YES" << '\n';
        for(auto e: v) {
            cout << e.first;
        }
        for(auto e: v) {
            cout << e.second;
        }
    }
    else cout << "NO";
    return;
}
 
int main()
{
    cin >> s;
    starttime;
    solve();
    stoptime;
    return 0;
}
1
22.10.2020, 11:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2020, 11:14
Помогаю со студенческими работами здесь

Счастливый билет
Ув. программисты, помогите пожалуйста несчастному студенту решить задачу. (о вознаграждении...

Задача на счастливый билет
Определить , является ли заданное с клавиатуры шестизначное число четным , счастливым (сумма...

Почти счастливый билет
В гугле полно задач про &quot;Счастливые билеты&quot;, а у меня возникла проблема с &quot;Почти счастливыми...

Написать код(счастливый билет)
Помогите пж. написать код:)

Задача про счастливый билет
Здравствуйте! Решаю задачу, но в 4 тесте - неправильный ответ. Помогите, пожалуйста, разобраться....

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru