题解:P11061 【MX-X4-T1】「Jason-1」IO++

· · 题解

芜湖,第一次见到 1 年前到现在还可以提交题解的题目。

思路

先解释题目。

一个只有输入输出的程序,它的行为用数组 a 来表示。如果 a_i0,就是输入,否则为输出。

但是呢,他有一个要求,输出的时候必须执行了 a_i 次输入。然后求这个程序至少要有多长。

每输入或者输出一次,长度都加 1,但是又有一个要求,所以不能直接加。输入的先不管,先算输出的,输出的就是数组 a 中不为 0 的部分,把他们出现的次数加起来就可以,如果是输入怎么办?我们可以把题目提的要求转换一下思路,要求要有 a_i 次输入,那我直接求 a_i 的最大值作为输入的次数不就可以了吗?

如果我这次输出需要的输入次数不够,那我就增加输入次数,直到可以进行这一次输出,当然增加不要超过了,只要能刚好执行这一次的输出(其实就是比较啦,如果需要输入次数的比当前的大,就把当前的输入次数变成现在需要的输入次数,就是把 ans 变成 a_i)。

那我定义两个变量 anssum,它们分别用于求输入的次数和输出的次数,每到 a_i 不为 0 的时候,sum 就加一,并且进行一次比较,如果 a_i 要求的输入次数,大与当前的输入次数 ans,那么就把 a_i 当做输入的次数。

最后把两个加起来输出就可以了。

代码

#include <bits/stdc++.h>
using namespace std;

int main() {

    int n, sum = 0, ans = 0; //一个是输入的总量,一个是输出的总量
    cin >> n;
    while (n--) {
        int a;
        cin >> a;
        if (a != 0) {
            sum++;
            ans = max(ans, a); 
            //max用于判断当前的输入次数能不能执行这一次输出
            //如果不行,那就是不够,要再增加输入次数
            //增加到刚好可以执行这一次输出
        }
    }
    cout << ans + sum << endl;

    system("pause");
    return 0;
}

应该没人现在还做这道题吧