兴中道是中山最美丽的道路--Java美丽的大树解题思路

题目描述

【问题描述】
兴中道是中山最美丽的道路,路中间的绿化带上种了两列漂亮的大树,这些大树分成了50行,每行两棵大树,一共100棵大树,这些大树被编上了号,编号方式如下:
1 3 5 7 ………… 95 97 99
2 4 6 8 ………… 96 98 100 
再过几天奥运火炬就要在中山传递了,美丽的兴中道当然是最重要的必经之路,但是某天晚上却发生了一件令人震惊的大事--可恶的破坏分子为了破坏奥运,让中山人民丢丑,竟然偷去了这100棵大树中的一部分!
公安部门马上出动,列出了被偷去了大树的编号。现在摆在我们面前的情况是,如果火炬的旁边是空空的树坑,那是令人无法接受的,因此我们只能压缩火炬在兴中道上的传递距离,务必使火炬在连续的大树边传递,当时,我们就得找出一列最长的连续的大树供传递火炬时展现在全世界的人面前。请你编写程序解决这一难题。

输入

【输入格式】
(表示有N棵大树被盗)
N1 N2 N3……NN  (被盗大树的编号)

输出

【输出格式】
M X   (表示从第M棵大树开始,共有连续的X棵大树,如果有多个解,只输出一个解即可)

样例输入

5
9 15 27 35 6

样例输出

8 47


此题困了好久.... 认真看注释。
为什么要51 为什么要 i-最长连续(取开始点) 为什么更新后 最长连续(取开始点) 置0

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] left = new int[51],right = new int[51];       //51是应付只偷一颗的情况
        int l,r;l = r = 0;
        for(int i = 1;i  <= 100;i++){                   //给予两排树编号
            if(i % 2 != 0 ){
                left[l++] = i;
            }else{
                right[r++] = i;
            }
        }

        left[left.length-1] = -1;       //第五十一棵树是-1
        right[right.length-1] = -1;     //第五十一棵树是-1

        int n = sc.nextInt(),t;         //n是投了多少棵树 t是被偷的树
        for(int i = 0;i < n;i++){
            t = sc.nextInt();
            if(t % 2 != 0){
                arr_fun(left,t);            //被偷的树置-1
            }else{
                arr_fun(right,t);            //被偷的树置-1
            }
        }

        int [] result = new int[3];         //三个元素 当xyz使用(传址)
        fun(left,result);                       //最关键的函数操作,
        fun(right,result);
        System.out.print(result[2] + " " + result[1]);






    }
    public static void arr_fun(int[] arr, int num){     //给偷的树置-1
        for(int i = 0;i < arr.length;i++){
            if(arr[i] == num){
                arr[i] = -1;
            }
        }
    }

    public static void fun(int [] arr , int [] result){     //主干算法
        for(int i = 0;i < 51;i++){          //循环51次,怕他偷1棵
            if(arr[i] != -1){               //计算连续树的长度
                result[0]++;                   //累加连续树的长度
            }else{
                if(result[0] > result[1]){      //【0】存储点 存储未更新短点,【1】存储连续 是更新点
                    result[1] = result[0];         //如果存储未更新短点 比 存储连续点短 那就更新。
                    result[2] = arr[i-result[1]];   //主干!!! 这一步直接存储 树 的连续最长开始点!!
                }
                result[0] = 0;                      //如果更新点比未更新点还少 那么不执行以上if 置0从来
            }

        }
    }
}

 

[1, 3, 5, 7, -1, 11, 13, -1, 17, 19, 21, 23, 25, -1, 29, 31, 33, -1, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
[2, 4, -1, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]


5
9 15 27 35 6

这是当时思考时 的 数据。

花开年年似 岁岁人不同 jy.
posted @ 2021-01-18 21:37  咸瑜  阅读(49)  评论(0编辑  收藏  举报