Зависит от количества навыков. Если он мал, я бы использовал простые числа. Более точно: Создать таблицу skills[n]
(где n - количество пользователей). Заполните его 1
s. Затем, если пользователь знает первое умение (в данном случае C) умножить на первое простое число (2), если он знает второе умение умножить на второе простое число и т. Д.
Затем, если вы хотите найти, если пользователь i
знает, второе умение (C++), просто проверить, если skills[i]%3==0
Пример: Finding значение умение: пользователь 1 знает умение 1 (C) и умение 3 (Perl), что означает его умение значение 1 * 2 * 5 = 10. Пользователь 2 знает умение 3, поэтому его умение составляет 1 * 5.
Поиск всех пользователей, которые могут использовать C, C++, Perl, соответствующий 2:
for(int i=0;i<n;i++){
int howMany=0;
if(skill[i]%2)==0)
howMany++;
if(skill[i]%5)==0)
howMany++;
if(skill[i]%7)==0)
howMany++;
if(howMany>=2)
addToResult(i);
}
В качестве альтернативы, вы можете создать 2d массив, где столбец соответствует человеку и грести к умению. Если значение равно 1, это означает, что человек знает, как использовать навык, если он установлен в 0, они этого не делают. Затем просто добавьте valus всех строк, которые вам нужны, и найдите подходящего пользователя.
Пример:
C 1 | 0 | 0 |
C++ 0 | 0 | 1 |
PERL 1 | 1 | 1 |
Позволяет найти кого-то, кто знает, C, Perl - мы добавляем все значения из строки 1 и 3, мы получаем
SUM 2 | 1 | 1 |
Только колонка 1 имеет значение> = 2 , что означает, что это единственный, который выполняет критерии. Теперь давайте попробуем найти кого-то, кто использует C, C++ и PERL, соответствие 2
SUM 2 | 1 | 2
Теперь мы знаем, что пользователь 1 и пользователь 3 имеет значение суммы> = 2, так что они соответствуют этим критериям.
Ваш первый пример не имеет смысла, поскольку у вас нет людей, которые знают Java. Вы забыли добавить их? – Xyzk
@JerryCoffin вы говорите о втором примере. Первый из них: «[EG] Набор навыков: C++ и Java Answer is 8" – Xyzk
@Xyzk: Упс - совершенно правильно. –