простенькое под водочку... из чисел 1,2,3,4,5,6,7,8,9 составить бы уравнение
AB*C=DEF=G*HJ,используя каждую цифру по одному разу. ( *-знак умножения, AB ,=12, если A=1,B=2 , DEF=123, если D=1,E=2,F=3)
Делители вначале подобрать C и G. 5 они не могут быть например. Ну и дальше разматывать. Как без подбора совсем обойтись я не знаю
Любезный Владимирович,Вы с уважаемым Долгопрудненским Боярином РР вместе пьете? Подбор собутыльника-это ключ...
У меня тоже без подбора не получилось....а может есть какой-то более элегантный путь? я не нашел...(((((
Все, что могу навскидку, это 1 кажется должон быть или в позиции D или E. F должон быть четным. 5 может быть в позициях B,D,E,H. D 8. Дальше видимо уже надо рассписывать варианты подставляя кандидатов в позицию F. Может оно становится сильно легче если перейти к другой форме записи чисел? Ну можно еще C или G исключить из уравнений, но от этого вроде не легче
Все, что могу навскидку, это 1 кажется должон быть или в позиции D или E. F должон быть четным. 5 может быть в позициях B,D,E,H. D 8. Дальше видимо уже надо рассписывать варианты подставляя кандидатов в позицию F.
кажется,я до этого дошел и стал подбирать...в задачках все-таки важен баланс усилий и результата,все-таки больше 10-15 минут это многовато...(((
int cmp_int(const void *a,const void *b)
{
int i;
i=0;
if (*(int *)a *(int *)b) i=1;
if (*(int *)a *(int *)b) i= -1;
return i;
}
int get_next_permutation(int *list, int l)
{
int i, j, swap, cmp_int();
if (l==2)
{
if (list[0] list[1])
return -1;
swap = list[0];
list[0] = list[1];
list[1] = swap;
return 0;
}
for (i=l-2; i=0; i--)
{
if (list list[i+1])
{
if (i==0)
return -1;
continue;
}
if (list list[l-1])
{
swap = list;
list = list[l-1];
list[l-1] = swap;
qsort(list+i+1, l-i-1, sizeof(int), cmp_int);
return 0;
}
for (j=i+1; jl; j++)
{
if (list[j] list)
continue;
swap = list;
list = list[j-1];
list[j-1] = swap;
qsort(list+i+1, l-i-1, sizeof(int), cmp_int);
return 0;
}
}
}
main()
{
int digits[9]={1,2,3,4,5,6,7,8,9};
int AB, C, DEF, G, HI;
int i, j;
AB = digits[0]*10+digits[1];
C = digits[2];
DEF = digits[3]*100 + digits[4]*10+digits[5];
G = digits[6];
HI = digits[7]*10 + digits[8];
while ((AB*C != DEF)||(DEF!=G*HI))
{
if (get_next_permutation(digits, 9) == -1)
{
printf( There is no solution to the problem\n);
exit(1);
}
/* printf(%d%d%d%d%d%d%d%d%d\n, digits[0], digits[1], digits[2], digits[3], digits[4], digits[5],
digits[6], digits[7], digits[8]);
*/ AB = digits[0]*10+digits[1];
C = digits[2];
DEF = digits[3]*100 + digits[4]*10+digits[5];
G = digits[6];
HI = digits[7]*10 + digits[8];
}
Пусть -1 - это шар на левой чашке, 1 - на правой, 0 - не участвует в взвешивании. После трёх взвешиваний каждому шару будет соответствовать трёхмерный вектор. Для весов -1 - левая чашка тяжелее, 1 - правая, 0 - равенство. Очевидно, что вектор весов будет равен или противоположен вектору бракованного шара. Задача: найти 12 трёхмерных векторов с координатами -1, 0, 1, где никакие два не равны и не противоположны друг другу и сумма по каждой координате будет равна нулю. Думаю, что так подойдёт:
Схема взвешиваний:
(1 1 0)
(1 -1 0)
(1 0 1)
(1 0 0)
(0 -1 -1)
(0 -1 0)
(0 1 -1)
(0 0 -1)
(-1 1 -1)
(-1 -1 1)
(-1 0 1)
(-1 1 1)
Весы самые обычные (как на советский рынках-базарах), где 2 чашечки:
_____ _____
|____________|
/\
СюгировФан написал(а):
Пусть -1 - это шар на левой чашке, 1 - на правой, 0 - не участвует в взвешивании...
СюгировФан - я в детали не вникал, только схему взвешиваний проверил - Ваше решение верное, но ведь задачка для детей, попробуй им объясни Ваши 3-D вектора.
В принципе, решение то простое, не требует никаких знаний. Только надо аккуратно всё подсчитать и объяснить.
РР, Вы нашли ещё одно решение. Судя по всему, их может быть несколько. В моём решении я тоже начинал с взвешивания по 4 шара. После обеда напишу моё решение (оно вроде как у СюгировФан-а). Надеюсь, там нет дыры.
Мне понравился метод описания PP.
*1*, *2*, *3* обозначают номера взвешиваний, когда написан знак #, он обозначает номер бракованного шара.
*1* {1,2,3,4} ? {5,6,7,8}
1A) If {1,2,3,4} = {5,6,7,8} then
*2* {9,10} ? {1,2}
2A) if {9,10} = {1,2} then candidates are 11 or 12
*3* {11}?{1}
3A) if {11}={1} then #12
if {11}!={1} then #11
2B) if {9,10} {1,2} (case is symmetrical) then light candidates are 9, 10
*3* {9}?{10}
3B) if {9}{10} then #9
if {9}{10} then #10
1B) without loosing generality (case is symmetrical) we will assume that
{1,2,3,4} {5,6,7,8} , then
*2* {1,2,5}?{3,4,6}
2C) if {1,2,5}{3,4,6}, then light candidates are 1,2, heavy candidate is 6
*3* {1}?{2}
3C) if {1}={2} then #6,
if {1}{2} then #2
if {1}{2} then #1
2D) if {1,2,5}={3,4,6}, then heavy candidates are 7,8
*3* {7}?{8}
3D) if {7}{8} then #8,
if {7}{8} then #7
2E) if {1,2,5}{3,4,6}, then heavy candidate is 5, light candidates are 3,4
*3* {3}?{4}
3D) if {3}={4} then #5,
{3}{4} then #3,
{3}{4} then #4