CSP17

小明种苹果(续)

  • 切忌在一个循环中干多件事情
  • csp不需要什么高超的算法,只要不是python一切好说

题目如下

题干1.png

题干2.png

原本写法

1获取输入
1.1获取输入同时计算最终果数
1.2获取输入同时计算落果数进行落果标记
2计算连续3颗树的落果组数
如图1所示

图1原先写法片段.png

改进写法

1获取输入
1.1获取输入同时计算最终果数
1.2获取输入同时只进行落果标记
2计算连续3颗树的落果组数
2.1计算组数同时计算落果标记

图2改进写法.png

区别在于:将落果数的计算移到了下方计算!

个人心得:

    应当是一个极简单的问题,但是却搞了一下午,也是通过比照满分算法得出的结论,算作是一次教训吧。
    另外网上关于算法比赛的代码很难看清楚,其一是没有注释,其二是命名太不规范,所以根据一个程序员的良心或者从业责任心也应当写的清楚明了。

最后附上完整代码:

int treeNum = 0;
    cin >> treeNum;
    
    //最终留下的果数
    int leftTotalNum = 0;
    //落果数
    int dropNum = 0;
    //3树落果组数
    int groupNum = 0;
    //根据最大果树数简历的标记落果情况的数组
    int dropArray[1000] = {0};

    //接收输入
    for (int i = 0; i < treeNum; i++)
    {
        dropArray[i] = 0;
        //本行参数数
        int num = 0;
        cin >> num;

        //参数1:苹果起始个数
        int thisBegin = 0;
        cin >> thisBegin;

        //标记苹果先前的剩余量
        int previous = thisBegin;
        for (int j = 1; j < num; j++)
        {
            //新的输入量
            int newNum = 0;
            cin >> newNum;

            //大于零表示计数
            if (newNum>0) {
                //小于先前果数表示落果
                if (newNum < previous) {
                    //防止树重复落果被重复计算
                    dropArray[i] = 1;
                    previous = newNum;
                }
            }
            //小于零表示梳果
            else {
                previous += newNum;
            }
        }
        //一行输入处理完毕将剩余果量归并
        leftTotalNum += previous;
    }

    //利用标记连续落果棵数计算组数
    int flag = 0;
    //果树指针
    int cursor = 0;
    //treeNum+2表示果树是环状,有边界条件
    for (int i = 0; i < treeNum+2; i++)
    {
        if (dropArray[cursor] == 1) {
            flag++;
            //在此处进行落果情况计算
            if (i=3) {
            groupNum++;
        }
        cursor++;
        //边界条件的处理,需要指针从尾部连接至首部
        cursor %= treeNum;
    }
    cout << leftTotalNum << " " << dropNum << " " << groupNum;

你可能感兴趣的:(CSP17)