马戏团_牛客网

搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列。 现在你手上也拿到了这样一份身高体重表,请找出可以叠出的最高罗汉塔的高度,这份表中马戏团员依次编号为1到N。

输入描述:

首先一个正整数N,表示人员个数。
之后N行,每行三个数,分别对应马戏团员编号,体重和身高。

输出描述:

正整数m,表示罗汉塔的高度。

示例1

输入

6

1 65 100

2 75 80

3 80 100

4 60 95

5 82 101

6 81 70

输出

4

 

分析:

题目的意思:如果身高相同,那么体重不同就可以叠;但是如果体重相同,则只有身高也相同时才可以叠

步骤:1.先按身高升序排列,当身高相同时按体重升序排列

          2.定义一个长度为N的数组F,第i个元素存放以第i个人结尾的最大叠罗汉层数初始化为1【每一个人都可以当成是一层】

          3.除第一个人外,其余每个人都和自己前面的人比较,如果自己的体重大于前面人的体重或者自己的体重身高都和前面的人相同时,选择F[i]与F[j]+1的较大值

          4.最后选择F[i]i:0~n-1中的最大值

public class Circus {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            Person[] arr = new Person[n];
            for (int i = 0; i < n; i++) {
                int index = scanner.nextInt();
                arr[index - 1] = new Person(scanner.nextInt(), scanner.nextInt());
            }
            Arrays.sort(arr, new Comparator<Person>() { //由于Person类本身没有实现内部比较器Comparable接口,所以需要传入一个外部比较器Comparator
                public int compare(Person p1, Person p2) {
                    int res1 = Integer.compare(p1.height, p2.height);  //取得按身高排序的结果
                    if (res1 != 0) {
                        return res1;
                    } else {   //身高相同的情况下,按体重升序排序
                        return Integer.compare(p1.weight, p2.weight);
                    }
                }
            });
            int[] F = new int[n];
            F[0] = 1;
            int max = 0;
            for (int i = 1; i < n; i++) {
                F[i] = 1;
                for (int j = i - 1; j >= 0; j--) {
                    if (arr[i].weight > arr[j].weight || (arr[i].weight == arr[j].weight && arr[i].height == arr[j].height)) {
                        F[i] = Math.max(F[i], F[j] + 1);
                    }
                }
                max = Math.max(max, F[i]);
            }
            System.out.println(max);
        }
    }
}

class Person {
    int weight;
    int height;

    public Person(int weight, int height) {
        this.weight = weight;
        this.height = height;
    }
}

 补充:

为什么F[i]取的是当前值和所有F[j](j:i-1~0)之间的最大值,考虑如下情况:

      w    h

0   60   95   1

1   65  100  2

2   40  101  1

3   82  102

在计算F[3]时,此时F[2]=1,F[1]=2,F[0]=1为了保证叠罗汉的层数更高,我们可以去掉F[2]【因为如果有F[2]的话那么此时以F[3]结尾的最大层数只能是2,但实际上是3】,所以在计算当前元素的最大层数,取的是当前值与前面所有值的最大值

为什么最后需要从该数组的每个元素中选取最大值,考虑如下情况:

     w    h

0  60   95   1

1  65  100  2

2  80  100  3

3  70  101  1

如上例子即可说明为什么最后要从每个元素中选最大的

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值