zoukankan      html  css  js  c++  java
  • hihoCoder 1041 国庆出游 最详细的解题报告

    题目来源:国庆出游

    解题思路(下面是大神的写的):

    把题目中的序列称作S,树称作T。那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中的位置都恰好紧跟在x的后面,没有被其他节点隔开。 设x的子孙节点是abcd,那么--xabcd--, --xbcda-- 等等是合法的,--xab-cd--, --axbcd--, --x--abcd--, 都是不合法的('-'指其他节点)。对于S中每个节点都做如上判断,如果有不合法的就输出NO,如果都合法就输出YES。

    感谢两位大神gtdzxaprilzc,解题思路是gtdzx大神提供的,代码参考aprilzc大神的

    具体算法(java版,可以直接AC)

     1 import java.util.Scanner;
     2 
     3 public class Main {
     4     //判断child是否为father的子孙节点
     5     public static boolean isAncestor(int[] tree, int father, int child) {
     6         while (tree[child] != child) {
     7             child = tree[child];//将child的父节点赋值给child
     8             if (father == child)
     9                 return true;
    10         }
    11         return false;
    12     }
    13 
    14     public static boolean judge(int[] tree, int[] array, int start, int end) {
    15         if (start >= end)//所有节点都检查完了
    16             return true;
    17         int k = start + 1;//当前节点的下一个节点
    18         //依次计算当前节点start后面的节点是否为它的子孙节点(这些节点必须是连续的)
    19         while (k <= end && isAncestor(tree, array[start], array[k])) {
    20             k++;
    21         }
    22         //如果后面所有的节点均是start的子孙节点
    23         //说明该节点的已经通过检查,然后判断下一个当前节点(start+1)
    24         if (k >= end) {
    25             return judge(tree, array, start + 1, end);
    26         }
    27         int v = k + 1;
    28         //判断后面的节点(除连续子孙节点外,k是第一个非连续子孙节点)
    29         //是否为start的子孙节点,如果是,说明存在一个非连续的子孙节点,
    30         //直接return false
    31         while (v <= end) {
    32             if (!isAncestor(tree, array[start], array[v])) {
    33                 return false;
    34             }
    35             v++;
    36         }
    37         
    38         //start已经检查完了,用来判断后面的节点(start+1)
    39         return judge(tree, array, start+1,end);
    40         
    41         //大神的最后一句代码如下:
    42         //return judge(tree, array, start, k - 1) && judge(tree, array, k, end);
    43         //个人觉得效果是一样的
    44     }
    45 
    46     public static void main(String[] args) {
    47         Scanner scanner = new Scanner(System.in);
    48         int T = scanner.nextInt();
    49         for (int i = 0; i < T; i++) {
    50             int n = scanner.nextInt();
    51             int[] tree = new int[n + 1];
    52             tree[1] = 1;
    53             for (int j = 0; j < n - 1; j++) {
    54                 int father = scanner.nextInt();
    55                 int child = scanner.nextInt();
    56                 tree[child] = father;
    57             }
    58             int m = scanner.nextInt();
    59             int[] array = new int[m];
    60             for (int j = 0; j < m; j++) {
    61                 array[j] = scanner.nextInt();
    62             }
    63             if (judge(tree, array, 0, array.length - 1)) {
    64                 System.out.println("YES");
    65             } else {
    66                 System.out.println("NO");
    67             }
    68         }
    69         scanner.close();
    70     }
    71 }
  • 相关阅读:
    jsf+ejb
    java CDI
    Android5.0新特性——阴影和剪裁(shadow)
    Android5.0新特性——图片和颜色(drawable)
    Android5.0新特性——全新的动画(animation)
    Android SDK Tools和Android SDK Platform-tools
    Android5.0新特性——Material Design简介
    emulator: ERROR: x86 emulation currently requires hardware acceleration!
    Android应用与系统安全防御
    JSON数据解析(转)
  • 原文地址:https://www.cnblogs.com/pinxiong/p/4076074.html
Copyright © 2011-2022 走看看