Алфавитный указатель
После теннисного турнира каждому игроку задавали вопрос, сколько матчей у него было.
Спортсмен не может играть более одного матча с другим спортсменом.
В качестве входных данных единственное, что у вас есть, это количество спортсменов и матчи каждого спортсмена. В качестве выхода у вас будет 1, если турнир можно будет сделать в соответствии с ответами спортсменов или 0, если нет. Например:
Input: 4 3 3 3 3 Output: 1
Input: 6 2 4 5 5 2 1 Output: 0
Input: 2 1 1 Output: 1
Input: 1 0 Output: 0
Input: 3 1 1 1 Output: 0
Input: 3 2 2 0 Output: 0
Input: 3 4 3 2 Output: 0
первый номер входа не входит в состав спортсменов, на него отвечает количество спортсменов, принимавших участие в турнире, например, в 6 2 4 5 5 2 1 у нас есть 6 спортсменов, которые принимали участие, и их ответы были 2 4 5 5 2 1.
Пока это то, что мы написали, но не получилось так хорошо:
import java.util.Scanner;
import java.util.Arrays;
public class Tennis {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String N;
int count;
int sum = 0;
int max;
int activeAthletes;
int flag;
System.out.printf("Give: ");
N = input.nextLine();
String[] arr = N.split(" ");
int[] array = new int[arr.length];
for (count = 0; count < arr.length; count++) {
array[count] = Integer.parseInt(arr[count]);
//System.out.print(arr[count] + " ");
}
for (count = 1; count < arr.length; count++) {
sum += array[count];
}
//System.out.println("\n" + sum);
activeAthletes = array[0];
for (count = 1; count < array.length; count++) {
if (array[count] == 0) {
activeAthletes--;
}
}
max = array[1];
for (count = 2; count < array.length; count++) {
if (array[count] > max) {
max = array[count];
}
}
// System.out.println(max);
if ((sum % 2 == 0) && (max < activeAthletes)) {
flag = 1;
} else{
flag = 0;
}
System.out.println(flag);
}
}
Я не хочу прямого решения, может быть, некоторых советов и подсказок, потому что мы действительно не знаем, что еще делать, и повторяю, хотя я буду отмечать его как домашнюю работу (потому что я чувствую, что модераторы снова закроют его) это не так, это то, что наш брат нашел, и мы пытаемся решить.
Хорошо, многие из вас ответили, и я очень благодарен, но поскольку завтра у меня есть работа, мне нужно заснуть, поэтому я, вероятно, завтра прочитаю оставшиеся ответы и посмотрю, что работает
Ответы
Ответ 1
Не уверен, что он работает на 100%, я бы хотел:
Эта логика (если она правильная) может привести к некоторым изменениям в решении O (N * log (N)), но в настоящее время я думаю, что это было бы слишком много для начинающего программиста.
EDIT:
Это не работает правильно на входе
2 2 1 1
Затем все шаги (без сортировки):
Ответ 2
Вот подсказка. Ответьте на эти вопросы.
- Учитывая N спортсменов, каково максимальное количество матчей?
- Учитывая спортсмена X, каково максимальное количество матчей, которое он мог сделать?
- Достаточно ли этого проверить? Если вы не уверены, попробуйте написать программу, чтобы создать все возможные соответствия игроков и проверить, удовлетворяет ли хотя бы один вход. Это будет работать только для небольших # ателетов, но это хорошее упражнение. Или просто сделайте это вручную.
Еще один способ задать этот вопрос, можно ли создать симметричную матрицу из 1s и 0s, строки которой равны значениям. Это будет таблица "кто играл кто". Подумайте об этом, как сетка N на N, где сетка [i] [j] = сетка [j] [i] (если вы играете с кем-то, кого вы играете) и сеткой [i] [i] = 0 (никто не играет сам)
Например
Input: 4 3 3 3 3 Output: 1
Похож на
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
Мы не можем сделать это с этим, хотя: Вход: 3 2 2 0 Выход: 0
ИЗМЕНИТЬ
Это эквивалентно этому (из Степень (теория графов))
Гамими (1962) доказал, что (d1, d2,..., dn) является степенной последовательностью a простой граф тогда и только тогда, когда (d2 - 1, d3 - 1,..., dd1 + 1 - 1, dd1 + 2, dd1 + 3,..., dn). Этот факт приводит к простому алгоритму поиска простой граф, который имеет заданную реализуемую последовательность степеней: - Начните с графа без краев.
- Ведение списка вершин, требование степени которых еще не выполнено в неубывающем порядке требования к остаточной степени.
- Подключите первую вершину к следующим вершинам d1 в этом списке, а затем удалите ее из списка. Повторно сортировать список и повторять до тех пор, пока все Требования к степени удовлетворены.
Задача нахождения или оценки числа графов с заданным Последовательность степеней является проблемой из поля перечисление графа.
Ответ 3
Возможно, вы можете взять массив совпадений матчей спортсменов и определить наибольшее количество там.
Затем посмотрите, можете ли вы разбить это число на 1 и вычесть их из нескольких других элементов массива.
Извлеките этот массив с наибольшим числом и удалите его из массива и обновите остальные члены с уменьшенными значениями.
Теперь повторите процесс - определите новое наибольшее число и вычтите его из других членов массива.
Если в какой-либо точке не хватает элементов массива для вычитания 1 из, то возвращайте приложение 0. В противном случае продолжайте делать это, пока в массиве не будет больше членов, после чего вы сможете вернуть приложение 1.
Кроме того, не забудьте удалить элементы массива, которые были уменьшены до нуля.
Ответ 4
Изменить: ниже решение передает некоторые недопустимые входы как действительные. Это быстрый способ проверить определенные негативы, но он допускает ложные срабатывания.
Вот что предложил бы математик:
- Сумма совпадений должна быть четной.
3 3 4 2 1
суммируется до 13
, что подразумевает, что кто-то сыграл матч против себя.
- Для игроков
n
, если в каждом матче исключается один игрок не менее n-1
, должны быть сыграны различные совпадения. (Турнир с нокаутом.) Чтобы увидеть это, нарисуйте дерево матчей для игроков 2, 4, 8, 16, 32..., требующих 1, 3, 7, 31... совпадений, чтобы решить победителя.
- Для игроков
n
максимальное количество совпадений, если каждый играет каждый раз, не принимая повторных совпадений, составляет n choose 2
или (n!)/(2!)(n-2)!
(турнир Round Robin). n!
- факториальная функция, n! = n * n-1 * n-2 * ... * 3 * 2 * 1.
.
Итак, критерии:
- Сумма количества совпадений должна быть четной.
- Сумма количества совпадений должна быть не менее
2n-2
. (Обратите внимание на умножение на 2 - каждое совпадение приводит к тому, что оба игрока увеличивают свой счет на единицу.)
- Сумма количества совпадений должна быть не более
2 * n choose 2
.
- [Изменить] Каждый игрок должен участвовать хотя бы в одном матче.
Если ваш турнир является перекрестком между турниром нокаутом и турниром с круговым движением, вы можете найти где-то между n-1
и n choose 2
.
Edit:
Если какой-либо игрок играет больше, чем n-1
, он играл не менее двух раз.
Если ваш турнир является турниром с нокаутом, заказанным так, чтобы каждый игрок участвовал в как можно меньшем количестве матчей, то каждый игрок может участвовать не более чем в log_2(n)
матчах или так (возьмите log
base 2 и округлите вверх.) В турнир с 16 игроками, максимум 4 матча. В турнире из 1024 игроков, максимум 10 матчей.
Ответ 5
Ваши примеры можно тривиально решить, посчитав совпадения и посмотрев, делятся ли они на 2.
Проблема, не охваченная вашими примерами, будет игроком, у которого больше игр, чем сумма других игроков:
Это может быть сложно, если добавить еще игроков:
- Вход: 6 5 5 5 1 1 1 Выход: 0
Как решить этот вопрос? Ну, удалите одну игру попарно из максимального и минимального игрока и посмотрите, что произойдет:
- Вход: 6 5 5 5 1 1 1
- Вход: 5 5 5 4 1 1 -
- Вход: 4 5 4 4 1 - -
- Вход: 3 4 4 4 - - -
Он нарушает правило:
Спортсмен не может играть более одного матча с другим спортсменом.
Если осталось 3 игрока, у них не может быть более двух игр.