Вы можете найти вопрос здесь: Благоприятное окончание . Вопрос в основном в том, чтобы найти маршруты со страницы 1, которые заканчиваются в благоприятном окончании. Например, для книги с 4 разделами. Если ввод такой, как показано ниже:
1 3 11 13
3 favourably
11 catastrophically
13 favourably
Вывод будет: 2
Для книги с 10 разделами. Если вход выглядит так:
1 21 6 17
3 favourably
6 catastrophically
8 favourably
12 favourably
15 6 33 12
17 15 8 33
21 3 29 15
29 favourably
33 catastrophically
Выход будет: 5.
Поскольку мы переходим на страницу 21 с 1 [21,6,17]
, который имеет [3,29,15]
, где 3 и 29ведет благоприятно (2)
, с 15, однако у нас есть [6,33,12]
, где только 12 выгодно,
означает, что теперь у нас +1 дает (3)
. Теперь мы переходим к 6 из 1 [6,17]
, что является катастрофическим, так что +0 дает (3)
.
Остальные - страница 17 из 1 [17]
, которая имеет [15, 8, 33]
. 15, как вычислено, имеет 1, так что (3+1)
, а путь 8 имеет один благоприятный, поэтому (3+1+1)=5
.
С этой логикой решение python, которое проходит все тестовые примеры, выглядит следующим образом:
num_tests = int(input())
for _ in range(num_tests):
num_secs = int(input())
ends = set()
bads = set()
p = {}
for _ in range(num_secs):
parts = input().split()
n = int(parts[0])
if parts[1][0] == 'f':
ends.add(n)
p[n] = []
elif parts[1][0] == 'c':
bads.add(n)
p[n] = []
else:
p[n] = map(int, parts[1:])
mem = {}
def search(index):
if index in mem:
return mem[index]
if index in ends:
return 1
ans = 0
for q in p[index]:
ans += search(q)
mem[index] = ans
return ans
print(search(1))
Тем не менее, реализация java проходит только один тестовый пример, и нет способа узнать, для какого тестового примера она не пройдена, но она проходит только один тестовый пример. Логика одинакова в обоих случаях. Я пропустил правило в реализации Java.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
public class FavourableEnding {
public static int checkDist(HashMap<String,Integer> mem, HashSet<String> set,HashMap<String,List<String>> m,String key) {
if(mem.get(key)!=null) {
return mem.get(key);
}
if(set.contains(key))
return 1;
int ans =0;
List<String> data = m.get(key);
for(int i=0;i<data.size();i++) {
ans+=checkDist(mem,set,m,data.get(i));
}
mem.put(key,ans);
return ans;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
while(sc.hasNext()) {
int numTests = sc.nextInt();
HashMap<String,Integer> mem = new HashMap<>();
HashSet<String> set = new HashSet<>();
HashMap<String,List<String>> m = new HashMap<>();
while(numTests-->0) {
int numSecs = sc.nextInt();
sc.nextLine();
while(numSecs-->0) {
String[] data = sc.nextLine().split(" ");
if(data[1].equals("favourably")) {
set.add(data[0]);
m.put(data[0],new ArrayList<>());
}else if(data[1].equals("catastrophically")) {
m.put(data[0],new ArrayList<>());
}else {
List<String> lst = new ArrayList<>();
lst.add(data[1]);
lst.add(data[2]);
lst.add(data[3]);
m.put(data[0], lst);
}
}
List<String> getDist = m.get("1");
int ans =0;
for(int i=0;i<getDist.size();i++) {
ans+=checkDist(mem,set,m,getDist.get(i));
}
System.out.println(ans);
}
}
}
}