Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64

Придумать алгоритм

15.06.2020, 19:06. Показов 2984. Ответов 41

Студворк — интернет-сервис помощи студентам
Всем привет!

Есть задача, допустим у нас есть множество, назовём его A. Как получить такое множество B, всевозможные суммы которого составляют A. Например: A = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17}, то B = {1, 2, 5, 9}, т.к. в A точно будут 0, 1, 2, 5, 9 а ещё:
  • 1 + 2 = 3
  • 1 + 5 = 6
  • 5 + 2 = 7
  • 5 + 1 + 2 = 8
  • 9 + 1 = 10
  • 9 + 2 = 11
  • 9 + 1 + 2 = 12
  • 9 + 5 = 14
  • 9 + 5 + 1= 15
  • 9 + 5 + 2 = 16
  • 9 + 5 + 2 + 1 = 17

Помогите придумать алгоритм

Добавлено через 42 минуты
Вот код решающий эту задачу:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
n = int(input())
A = []
#Ввод массива A (по строчкам)
for _ in range(2 ** n):
    A += [int(input())]
A.sort()
 
B = []
for i in range(n):
    for j in range(2 ** n):
        if A[j] > sum(B): #Проверяем, могло ли число быть составленным из уже имеющихся
            B += [A[j]]
            break
print(B)
Как думаете, правилен ли он? Можно ли сделать его проще? Буду очень благодарен помощи
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2020, 19:06
Ответы с готовыми решениями:

Какой придумать алгоритм?
Здравствуйте, существует такая задача: Есть 2 списка целых чисел Например: список 1: { 1,2,3,2,4,2,1,1,5} список...

Придумать алгоритм (работа с двумерным массивом)
Друзья! Нужен такой алгоритм. Имеется массив M*N, и все клетки в нём закрашены чёрным цветом. Нужно РАНДОМНО выбрать несколько областей...

Придумать алгоритм, переводящий числа друг в друга
Друзья! Работаем с числами в двузначной системе счисления. Дано любое число, например 10. Пишем числа от 0 до 9 включительно: ...

41
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
19.06.2020, 18:50  [ТС]
Студворк — интернет-сервис помощи студентам
Shamil1, мне не совсем ясно что нужно оптимизировать, я вроде перевел на питон и трудностей не нахожу. Можете посмотреть код:
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
def solve(a):
    if a[0] != 0:
        return 0
    b = [a[1]]
    a2 = [0]
    y = b[0]
 
    while True:
        addToA = [x + y for x in a2]
        for i in addToA:
            if (i not in a) or (i in a2):
                return 0
        a2 += addToA
        if len(a2) == len(a):
            return b
        for i in a:
            if i not in a2:
                y = i
                break
        b.append(y)
 
n = int(input())
a = [int(input()) for _ in range(2 ** n)]
a.sort()
answer = solve(a)
if answer == 0:
    print("impossible")
else:
    for element in answer:
        print(element)
Ситуация {2, 3, 4} тоже спокойно работает.

Добавлено через 14 минут
Странно, падает тот же тест что и у решения LegionK
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,912
19.06.2020, 19:06
Цитата Сообщение от dx3n Посмотреть сообщение
Странно, падает тот же тест что и у решения LegionK
Значит, мы что-то в математике упустили. Какой-то хитрый граничный случай. Либо, например, в массиве А могут быть одинаковые элементы, а я считал, что не могут.
Вы можете привести данные, на которых мой код даёт неверный результат?

Цитата Сообщение от dx3n Посмотреть сообщение
мне не совсем ясно что нужно оптимизировать
Чтобы Contains() работала за константное время. В моём коде работает за линейное.
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
19.06.2020, 19:17  [ТС]
Shamil1, я сам сейчас стараюсь придумать такой пример. В условии задачи написано что элементы вроде разные. Я нашел еще одно обсуждение этой задачи где фигурирует вот такой код:
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
44
45
N = int(input())
a = []
 
for i in range(2 ** N):
    a.append(int(input()))
a.sort()
 
if N == 1:
    print(a[-1])
 
elif 0 not in a:
    print('impossible')
 
elif N == 2:
    if a[1] + a[2] == a[3]:
        result = [a[1], a[2]]
        print(*result)
    else:
        print('impossible')
 
else:
    result = [a[1], a[2]]
 
    for j in range(3, 2 ** N):
        if a[j] != result[0] + result[-1]:
            result.append(a[j])
 
    result = result[:N]
 
    SUMS = [a[0], result[0]]
    SUMS_1 = []
    for g in range(1, N):
        x = result[g]
        for g1 in range(len(SUMS)):
            SUMS1 = SUMS[g1] + x
            SUMS_1.append(SUMS1)
        SUMS = SUMS + SUMS_1
        SUMS_1 = []
    SUMS.sort()
 
    if SUMS == a:
        result = result[:N]
        print(*result)
    else:
        print('impossible')
Этот код как раз таки проходит этот тест, но у него где-то проблемы в логике. У него код падает с run-time error.

Добавлено через 4 минуты
Вот если что это обсуждение: Проездные
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 16:16  [ТС]
Помогите оптимизировать вот этот код. Он слишком долго выполняется
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 sum(result, v, index, curSum):
        if index < len(v):
            curSum += v[index]
            for i in range(index + 1, len(v)):
                res = sum(result, v, i, curSum)
                result += [res]
        
        return curSum
def f(arr):
    result = []
    for i in range(len(arr)):
        res = sum(result, arr, i, 0)
        result += [res]
    
    return result
 
n = int(input())
arr = [int(input()) for _ in range(2 ** n)]
arr.sort()
if arr[0] != 0:
    print("impossible")
else:
    del arr[0]
    check = arr[:]
    answer = [arr[0]]
    while True:
        sums = f(answer)
        for i in sums:
            if i in arr:
                arr.remove(i)
        if len(arr) == 0:
            break
        else:
            answer += [arr[0]]
 
    if len(answer) == n:
        if set(f(answer)) == set(check):
            for i in answer:
                print(i)        
        else:
            print("impossible")
    else:
        print("impossible")
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
20.06.2020, 16:33
dx3n,
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
def solve(a):
    if a[0] != 0:
        return 0
    b = [a[1]]
    a2 = [0]
    y = b[0]
 
    while True:
        addToA = [x + y for x in a2]
        for i in addToA:
            if (i not in a) or (i in a2):
                return 0
        a2 += addToA
        if len(a2) == len(a):
            return b
        for i in a:
            if i not in a2:
                y = i
                break
        b.append(y)
 
n = int(input())
a = [int(input()) for _ in range(2 ** n)]
if n == 1:
    print(a[-1])
    0
elif n == 2:
    if a[1] + a[2] == a[3]:
        result = [a[1], a[2]]
        print(*result)
    else:
        print('impossible')
else:
  a.sort()
  answer = solve(a)
  if answer == 0:
      print("impossible")
  else:
      for element in answer:
          print(element)
добавил такие проверки и упало уже на десятом тесте wa
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 16:40  [ТС]
rembor, вы не сделали проверку на ноль еще.
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
20.06.2020, 16:41
LegionK, с проверкой на два падает уже на шестом тесте
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 16:42  [ТС]
rembor, пожалуйста как нибудь помогите оптимизировать код который я написал выше. Он даёт ошибку на 20 тесте из-за TL. Его надо доработать и это будет решением.
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
20.06.2020, 16:50
dx3n, она есть же

Добавлено через 30 секунд
dx3n, можно попробовать на c++ переписать
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 16:52  [ТС]
rembor, всмысле?

Добавлено через 1 минуту
rembor, я в переписывании на c++ не спец. Тем более там очень громадный код получится и некоторые функции придется писать вручную( А вы спец на c++?
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
20.06.2020, 19:09
dx3n, завтра попытаюсь наверно, если вы уже не решили, конечно
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 19:32  [ТС]
rembor, пока никак, но спасибо вам огромное
0
Наивное Существо
 Аватар для vedunasv
666 / 141 / 27
Регистрация: 09.05.2020
Сообщений: 750
Записей в блоге: 15
20.06.2020, 20:11
dx3n, уточняю для себя (настоящее задание вижу про билеты).... получается по задаче, что первоначально задан массив В, мы его считаем так-сяк и из которого (из массива В) потом выходит массив А . Так?
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
20.06.2020, 20:18  [ТС]
vedunasv, наоборот. Задан массив A а мы его так и сяк и получается B. Надо придумать это так и сяк
0
Наивное Существо
 Аватар для vedunasv
666 / 141 / 27
Регистрация: 09.05.2020
Сообщений: 750
Записей в блоге: 15
20.06.2020, 21:31
dx3n, ага, ясно. Первое мнение о задаче так и было, что массив А главный. А через два часа читаю - и мнение поменялось . Поэтому и спрашиваю.... Короче-надо думать над математикой, а потом уже переводить... Но математикой я владею еще хуже,чем своим здоровьем....
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
21.06.2020, 11:25
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
#include<bits/stdc++.h>
using namespace std;
long long sum(vector<long long> &result, vector<long long> &v, long long index, long long curSum)
{
    long long res=0;
    if(index<v.size())
    {
        curSum+=v[index];
        for(int i=index+1;i<v.size();i++)
        {
            res=sum(result, v, i, curSum);
            result.push_back(res);
        }
    }
    return curSum;
}
long long f(vector<long long> &arr,vector<long long> &result)
{
    for(long long i=0;i<arr.size();i++)
    {
        long long res;
        res=sum(result,arr,i,0);
        result.push_back(res);
    }
}
 
int main()
{
    long long n,m;
    cin>>n;
    vector<long long>arr(1<<n);
    vector<long long>::iterator it;
    for(int i=0;i<1<<n;i++)
    {
        cin>>arr[i];
    }
    sort(arr.begin(),arr.end());
    if(arr[0]!=0)
    {
        cout<<"impossible";
    }
    else
    {
        arr.erase(arr.begin(),arr.begin()+1);
        vector<long long>check;
        check=arr;
        vector<long long>answer;
        answer.push_back(arr[0]);
        while(true)
        {
            vector<long long>sums;
            f(answer,sums);
            for(int i=0;i<sums.size();i++)
            {
                it=find (arr.begin(), arr.end(), sums[i]);
                if (it!=arr.end())
                {
                    arr.erase(it,it+1);
                }
            }
            if(arr.size()==0)
            {
                break;
            }
            else
            {
                answer.push_back(arr[0]);
            }
        }
        if(answer.size()==n)
        {
            for(int i=0;i<answer.size();i++)
            {
                cout<<answer[i]<<endl;
            }
        }
        else
        {
            cout<<"impossible";
        }
    }
    return 0;
}
переписал, но аналогично tl на двадцатом тесте
0
0 / 0 / 0
Регистрация: 15.06.2020
Сообщений: 64
22.06.2020, 12:14  [ТС]
rembor, ты решил эту задачу?
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
22.06.2020, 12:35
dx3n, пока нет
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
22.06.2020, 12:43
rembor,
Цитата Сообщение от rembor Посмотреть сообщение
с проверкой на два падает уже на шестом тесте
Какая ещё проверка на 2?
0
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 36
22.06.2020, 12:54
LegionK,
Python
1
2
3
4
5
if a[1] + a[2] == a[3]:
        result = [a[1], a[2]]
        print(*result)
    else:
        print('impossible')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2020, 12:54

Какой можно придумать алгоритм для такой игры?
Правила игры: Игра происходит на доске (например 8x8) Сначала каждому игроку даются фишки с определенным числом (весом). С одной из 4...

Придумать алгоритм для задачи: Найти шарики в коробке
Имеется 50 пронумерованных (от 1 до 50) бесцветных шариков. Имеется 5 бесцветных пустых коробок. 40 шариков в случайном порядке...

Алгоритм правдоподобного перемещения курсора мыши. Что можно придумать?
Добрый день. Стоит задача сделать так, чтобы перемещение указателя мыши было максимально похоже на перемещение этого указателя человеком. ...

Какой придумать алгоритм для расстановки фигур в определённом порядке. По-сути это игра "пятнашки"
Нужно придумать алгоритм нахождения оптимального решения, то есть наименьшее количество перестановок. Подскажите идею, как это...

Не могу придумать интерфейс
Есть форма, в которой нужен ввод информации о человеке: фамилия, имя, отчество, вид, серия и номер документа. Вид документа выбирается из...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru