CCF201909-2 小明种苹果(续)(JAVA)

CCF201909-2 小明种苹果(续)(JAVA)_第1张图片

CCF201909-2 小明种苹果(续)(JAVA)_第2张图片

解题思路:

这道题需要我们算出T、D、E,而这三个量都可以在每次读入输入数据时对其进行更新,从而在读完全部输入数据时得到的T、D、E就是我们的最终所求。

因此,对于这道题,我们可以采用无遍历的方式来做:

对于T来说,如果树a本次操作是非正值(疏果操作)那么进行累加,是正值(统计操作)则进行替换。最终将每棵树得到的Ta进行累加则可算出T。

对于D来说,如果某棵树某次的统计操作结果!=正常疏果后的计算结果,那么该树存在落果且在对该树进行所有操作之后D++。最终的D即为所求。

对于E来说,若树的棵树大于等于3棵那么我们需要记录下前两棵树的落果状况以便最后一棵树的浪子回头。我们用Combo来记录连击数,每有一个有缘树(有落果),Combo++。每有三棵树连续掉落则达成目标,E++,同时将Combo-1等待下一棵有缘树。若接下来的这棵树不是有缘树,那么一粒老鼠屎打坏一锅汤,Combo清零。最终累加算得的E即为所求。

此外,本题中有一点需值得注意的是,当只有三棵树且都有落果时,A1A2A3算一组,A2A3A1算一组,A3A1A2也算一组,所以该情况共计有3组(顺序不同,3棵树相同)。

测试案例供复制:

4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0

 

5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0

代码:

package AppleTree2;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();//苹果数棵数
        int T = 0;//剩下苹果总数
        int D = 0;//掉落的棵数
        int E = 0;//连续掉落组数
        int tree1 = 0;//记录第一棵苹果树的掉落情况
        int tree2 = 0;//记录第二棵苹果树的掉落情况
        int Combo = 0;//连续掉落的树的棵数(<3)
        for (int i = 0; i < N; i++) {
            int fall = 0;//判断该树是否存在掉落(1-掉落,0-未掉落)
            int mi = sc.nextInt();//操作数
            int temp = sc.nextInt();//记录统计的苹果个数
            for (int t = 0; t < mi - 1; t++) {
                int m = sc.nextInt();//m操作
                if (m > 0) {//统计操作
                    if (temp - m > 0) {//掉落
                        fall = 1;
                        temp = m;
                    }
                } else {//疏果操作
                    temp = temp + m;
                }
            }
            if (fall == 1) {//判断当前树是否有落果
                Combo++;
                if (Combo == 3) {
                    E++;
                    Combo--;
                }
            } else
                Combo = 0;
            if (N >= 3) {//浪子回头
                if (i == 0) tree1 = fall;
                else if (i == 1) tree2 = fall;
                else if (i == N - 1&& fall==1) {
                    if (tree1 == 1&&Combo == 2)E++;
                    if (tree1 == 1&&tree2 == 1)E++;
                }
            }
            T += temp;
            D += fall;
        }
        System.out.println(T + " " + D + " " + E);
    }
}

 

你可能感兴趣的:(CCF真题)