2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Алгоритм
Сообщение01.10.2012, 22:32 


31/01/11
97
Не могу понять как решить такую задачу - у нас есть весы и какой то продукт весом x. Еще у нас есть грузики с весом 1,3,9,27 и тд по 1 штуке. Нужно определить сколько грузиков нужно использовать, чтобы сказать сколько весит х. Ну например, ввели х = 8. Значит нужно 2 грузика - 9 на одну чашку весов и 1 на другую

Вероятно, можно как то действовать через троичную систему счисления...

 Профиль  
                  
 
 Re: Алгоритм
Сообщение01.10.2012, 23:40 


05/09/12
2587
UPD оптимизировал немножко код
Код:
function Ivana_balance_3(V)

int = sum(V);

if int == 0
    V(1) = [];
    V
    m = abs(sum(V))
    return
end

m = 1;
while m < 2*abs(int)/3
    m = m*3;
end

V = [V, -sign(int)*m];

Ivana_balance_3(V);

Вызов
Код:
V = 3125;
Ivana_balance_3(V);

Результат
Код:
V =
       -2187        -729        -243          27           9          -3           1
m =
        3125

Положительные веса на чашку с грузом, отрицательные на другую. Разбирайтесь :wink:

 Профиль  
                  
 
 Re: Алгоритм
Сообщение01.10.2012, 23:44 
Заслуженный участник


27/04/09
28128
boomeer в сообщении #625872 писал(а):
Вероятно, можно как то действовать через троичную систему счисления...
Ага. Есть такая особая волшебная троичная система с цифрами $\{-1, 0, 1\}$.

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 02:31 


05/09/12
2587
Убрал рекурсию и заменил простые циклы на лаконичные по записи но более долгие по вычислениям элементарные функции :-)
Код:
int = 3125;
while int ~= 0
    g = - sign(int)*3^fix(log(2*abs(int))/log(3))
    int = int + g;
end

Код:
-2187
-729
-243
27
9
-3
1

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 06:48 
Аватара пользователя


31/10/08
1244
назодишь лучшее приближение вычитаешь. Считаем новое число как исходно данное его нам задали. Т.е реккурсивный алгоритм. В зависимости от знака кладёшь грузики на нужную сторону.

И учесть что если a<x<b. где a, b наиболее близки. Если a<x<2a то решентя ищется как х-a, а если
2a<x<=b то решение надо ещё проверить
x_new=b-x.

если х=2a то решения нет.

-- Вт окт 02, 2012 07:48:17 --

назодишь лучшее приближение вычитаешь. Считаем новое число как исходно данное его нам задали. Т.е реккурсивный алгоритм. В зависимости от знака кладёшь грузики на нужную сторону.

И учесть что если a<x<b. где a, b наиболее близки. Если a<x<2a то решентя ищется как х-a, а если
2a<x<=b то решение надо ещё проверить
x_new=b-x.

если х=2a то решения нет.

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 07:52 
Заслуженный участник


11/05/08
32166
Используется синтаксис Pascal
{w - полный вес                }
{m - грузиков текущего номинала}
{n - полное количество грузиков}
n:=0;
while w>0 do begin
    m:=w mod 3;
    if m<>0 then n:=n+1;    {кладём грузик то ли направо, то ли налево}
    if m=2 then w:=w+1;     {если положили налево}
    w:=w div 3;
end;

(Я не помню, какие там функции в Матлабе реализуют целочисленное деление; какие-то есть.)

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 10:32 


31/01/11
97
ewert в сообщении #625953 писал(а):
Используется синтаксис Pascal
{w - полный вес                }
{m - грузиков текущего номинала}
{n - полное количество грузиков}
n:=0;
while w>0 do begin
    m:=w mod 3;
    if m<>0 then n:=n+1;    {кладём грузик то ли направо, то ли налево}
    if m=2 then w:=w+1;     {если положили налево}
    w:=w div 3;
end;


Спасибо! Элегантно.
А как бы сюда добавить ограничение на то, что на каждой чаше весов может быть не более 1'000'000 единиц?

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 11:44 


05/09/12
2587
Pavia в сообщении #625943 писал(а):
а если
2a<x<=b то решение надо ещё проверить
x_new=b-x.

если х=2a то решения нет.
Как нет? То есть, не все массы можно взвесить такими гирями? У меня получается все - что я делаю не так? :-)

ewert в сообщении #625953 писал(а):
Я не помню, какие там функции в Матлабе реализуют целочисленное деление; какие-то есть.
Наверное есть, но пока я разбираюсь с ним на подобных задачках, использую целую часть от обычного деления.

boomeer в сообщении #625995 писал(а):
А как бы сюда добавить ограничение на то, что на каждой чаше весов может быть не более 1'000'000 единиц?
Вам написали несколько вариантов кодов и даже рассказали словами логику. Неужели не справитесь с введением ограничений?

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 13:31 


05/09/12
2587
А вообще, предлагаю автору решить пару простеньких подзадачек:
1) Доказать что любой целый вес можно взвесить данным набором гирь, с одной гирей каждой массы.
2) Посчитать максимальный вес, любое значение до которого можно взвесить $n$ первыми гирями. Подставить в эту формулу 1'000'000 и оценить результат :-)

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 18:43 
Аватара пользователя


31/10/08
1244
_Ivana
Взвесь x=6

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 19:37 


05/09/12
2587
Pavia, 3 на чашку с грузом, 9 на другую. Сколько ещё взвесить? Не стесняйтесь, заказывайте побольше - у меня все равно компьютер быстро считает :lol:

 Профиль  
                  
 
 Re: Алгоритм
Сообщение02.10.2012, 19:55 
Заслуженный участник


27/04/09
28128
Взвешиваемо любое целое число, т. к. я ничего не выдумал про систему счисления. Нормальная позиционная система, в ней можно представить любое действительное число, как и в обычной троичной.

 Профиль  
                  
 
 Re: Алгоритм
Сообщение04.10.2012, 08:58 


31/01/11
97
мой код вышел такой
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{
    int n,ans=0,k=0;
    scanf("%d", &n);
    while (n>0)
    {
        if (n>1000000)
            {
                printf("Перевес");
                exit(0);
            }
        if ((n/(int)pow(3,k)%3)==1)
            {
                n-=pow(3,k);
                ans++;
            }
        else if ((n/(int)pow(3,k)%3)==2)
        {
            ans++;
            n+=pow(3,k);
        }
        k++;
    }
    printf("%d Ответ",ans);
}


-- Чт окт 04, 2012 09:08:08 --

Два новых вопроса.
1) На вход подают число $N<=100$;
Затем N строк по 4 числа - первые 3 координаты шаров, 4я радиус шара.
Нужно определить, есть ли два шара имеющих общую точку.

2)На вход подается число $N<=4000$.
Затем последовательность из N чисел, где каждое число $<= 100000$.
Нужно найти, сколько существует троек чисел $(i, j, k)$ таких, что:
$1 <= i < k < j <= N$
$k = (i + j) / 2$
$a_k = (a_i + a_j) / 2$

 Профиль  
                  
 
 Re: Алгоритм
Сообщение04.10.2012, 14:46 


31/01/11
97
С шарами решил, а тут не придумаю как ограничить перебор...

 Профиль  
                  
 
 Re: Алгоритм
Сообщение04.10.2012, 16:16 


31/01/11
97
Обе решил.
Другая - более интересная.
Некто расставил на шахматной доске кубики. Посмотрел на них прямо спереди и сказал слева направо сколько кубиков он видит (8 столбиков)
Затем посмотрел справа на них и тоже сказал сколько кубиков он видит, тоже справа налево.
Наша задача сказать, какое наименьшее кол-во кубиков могло быть на доске или сообщить некто, что он ошибся.

Например, для
1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0
Ответ 4;

А для
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 2
Следует оказать, что некто ошибся.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group