Программисты помогите с кодом, олимпиадная задачка, нужно найти ошибку.Нужно найти ошибку в коде. Проходит 11 проверок из 12.Код: using System;class Example{static void Main(){int A = int.Parse(Console.ReadLine()),B = int.Parse(Console.ReadLine()),C, D;if (A >= 1)if (A <= 10000000)if (B >= 1)if (B <= 10000000) {if ((A * 50) - (B * 70) < 50)if ((B * 70) - (A * 50) < 50){if ((A * 50) < (B * 70)){if (((A * 50) % 60) != 0){C = ((A * 50) / 60) + 1;D = (((A * 50) - 49) / 60) + 1;if (C == D){Console.WriteLine(C);}else{Console.Write(C);Console.Write(" ");Console.Write(D);}}else{C = (A * 50) / 60;D = (((A * 50) - 49) / 60) + 1;if (C == D){Console.WriteLine(C);}else{Console.Write(D);Console.Write(" ");Console.Write(C);}}}else{if (((B * 70) % 60) != 0){C = ((B * 70) / 60) + 1;D = (((A * 50) - 49) / 60) + 1;if (C == D){Console.WriteLine(C);}else{Console.Write(D);Console.Write(" ");Console.WriteLine(C);}}else{C = (B * 70) / 60;D = (((A * 50) - 49) / 60) + 1;if (C == D){Console.WriteLine(C);}else{Console.Write(D);Console.Write(" ");Console.WriteLine(C);}}}}else Console.WriteLine("-1");else Console.WriteLine("-1");}else Console.WriteLine("-1");else Console.WriteLine("-1");else Console.WriteLine("-1");else Console.WriteLine("-1");}}Задача: Завод по производству колы изготавливает ее не только для магазинов, но и для всемирно известной сети ресторанов быстрого питания.Ежедневно завод отгружает один и тот же объем колы в литрах. Служба доставки сети ресторанов обычно использует для транспортировки колы емкости объемом или только 50 литров, или только 70 литров. Если доставка осуществляется с помощью емкостей в 50 литров, то для перевозки имеющегося объема колы необходимо A емкостей. А если с помощью емкостей в 70 литров, то необходимо B емкостей. При этом в каждом из случаев одна из емкостей может быть заполнена не полностью.Недавно сеть ресторанов решила утвердить новый объем емкостей для доставки колы — 60 литров. Сколько емкостей теперь может понадобиться для доставки того же самого объема колы?

Вопрос школьника по предмету Информатика

Программисты помогите с кодом, олимпиадная задачка, нужно найти ошибку.

Нужно найти ошибку в коде. Проходит 11 проверок из 12.
Код: 
using System;
class Example
{
static void Main()
{
int A = int.Parse(Console.ReadLine()),
B = int.Parse(Console.ReadLine()),
C, D;
if (A >= 1)
if (A <= 10000000)
if (B >= 1)
if (B <= 10000000) {
if ((A * 50) — (B * 70) < 50)
if ((B * 70) — (A * 50) < 50)
{
if ((A * 50) < (B * 70))
{
if (((A * 50) % 60) != 0)
{
C = ((A * 50) / 60) + 1;
D = (((A * 50) — 49) / 60) + 1;
if (C == D)
{
Console.WriteLine(C);
}
else
{
Console.Write(C);
Console.Write(» «);
Console.Write(D);
}
}
else
{
C = (A * 50) / 60;
D = (((A * 50) — 49) / 60) + 1;
if (C == D)
{
Console.WriteLine(C);
}
else
{
Console.Write(D);
Console.Write(» «);
Console.Write(C);
}
}

}
else
{
if (((B * 70) % 60) != 0)
{
C = ((B * 70) / 60) + 1;
D = (((A * 50) — 49) / 60) + 1;
if (C == D)
{
Console.WriteLine(C);
}
else
{
Console.Write(D);
Console.Write(» «);
Console.WriteLine(C);
}
}
else
{
C = (B * 70) / 60;
D = (((A * 50) — 49) / 60) + 1;
if (C == D)
{
Console.WriteLine(C);
}
else
{
Console.Write(D);
Console.Write(» «);
Console.WriteLine(C);
}
}
}
}

else Console.WriteLine(«-1»);
else Console.WriteLine(«-1»);
}
else Console.WriteLine(«-1»);
else Console.WriteLine(«-1»);
else Console.WriteLine(«-1»);
else Console.WriteLine(«-1»);
}
}

Задача: Завод по производству колы изготавливает ее не только для магазинов, но и для всемирно известной сети ресторанов быстрого питания.
Ежедневно завод отгружает один и тот же объем колы в литрах. Служба доставки сети ресторанов обычно использует для транспортировки колы емкости объемом или только 50 литров, или только 70 литров. Если доставка осуществляется с помощью емкостей в 50 литров, то для перевозки имеющегося объема колы необходимо A емкостей. А если с помощью емкостей в 70 литров, то необходимо B емкостей. При этом в каждом из случаев одна из емкостей может быть заполнена не полностью.
Недавно сеть ресторанов решила утвердить новый объем емкостей для доставки колы — 60 литров. Сколько емкостей теперь может понадобиться для доставки того же самого объема колы?

Ответ учителя по предмету Информатика

Запишу сначала за вас условие до конца:

Первая строка ввода содержит два числа A и B, разделенных пробелом (1 ≤ A, B ≤ 10 000 000).Выведите все возможные значения для количества емкостей по 60 литров, которые окажутся заполненными (в том числе одна возможно частично), в порядке возрастания или число −1, если значения A и B противоречат друг другу, то есть они были записаны неверно.

Теперь к вопросам по форме. 

Во-первых, если в условии указаны ограничения на входные данные, им можно верить, проверять, что 1 <= A, B <= 10000000 не обязательно. 

Во-вторых, научитесь пользоваться &&, ||, это позволит не дублировать код. 4 раза написанное else Console.WriteLine(«-1»); не очень помогает читать.

А уже теперь по сути.

Ваше условие противоречивости условия |50A — 70B| < 50 нехорошее. Если общий объем колы, например, 141, то A = 3, B = 3, но при этом |50A — 70B| = 60, что больше 50.

Смотрю дальше.

если 50A < 70B, то если 50A не делится на 60, то ответ [(50A — 49)/60] + 1 или [50A/60] + 1 (если это одно и то же, не важно). Это тоже как минимум не очевидно: представим, что [(70B-69)/60] + 1 оказался больше, чем [(50A-49)/60] + 1. Тогда ответ точно неверен.

Какие были бы мои рассуждения:

Поищем, какое могло бы быть общее количество колы. Пусть её N, тогда

50(A — 1) < N <= 50A

70(A — 1) < N <= 70B

Тогда max(50A — 50, 70B — 70) < N <= min(50A, 70B). 

Если max(50A — 50, 70B — 70) >= min(50A, 70B), то решений нет, надо выводить -1. Иначе думаем дальше.

Строгое неравенство иметь что-то не хочется, сделаем из него нестрогое. Если добавлю к левой части 1, то количество 60-литровых ёмкостей явно не поменяется, зато неравенство станет нестрогим. Пусть так и будет, раз ответ не меняется. Только в проверке равенство поменяю на строгое.

max(50A — 50, 70B — 70) + 1 <= N <= min(50A, 70B)

Теперь просто считаем число ёмкостей слева, справа, и выводим все числа от первого до второго.

Поняв всё это, просто превращаем слова в программу.

using System;

class CocaCola

{

  public static void Main (string[] args)

  {

    int A = int.Parse(Console.ReadLine()), 

        B = int.Parse(Console.ReadLine());

    int lowerLimit = Math.Max(50 * A — 50, 70 * B — 70) + 1;

    int upperLimit = Math.Min(50 * A, 70 * B);

    if (lowerLimit > upperLimit)

    {

      Console.Write(-1);

      return;

    }

    for (int i = (int)Math.Ceiling(lowerLimit / 60.0); i <= Math.Ceiling(upperLimit / 60.0); i++)

      Console.Write(«{0} «, i);

  }

}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Похожие вопросы от пользователей