Благоприятное окончание - PullRequest
0 голосов
/ 18 октября 2019

Вы можете найти вопрос здесь: Благоприятное окончание . Вопрос в основном в том, чтобы найти маршруты со страницы 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);
            }

        }
    }

}
...