牛客小白月赛76 D~E

做到e题摆烂了

D. MoonLight的运算问题

D-MoonLight的运算问题_牛客小白月赛76 (nowcoder.com)

题意

给定一个数字\(x\)和一个数组,这个数字最初为0。遍历一遍数组,对于每个元素,可以有乘\(x\)和与\(x\)相加两种操作。求最后\(x\)能得到的最大值模998244353的值。

思路

\(x>1\)且数组元素不为0或1时,选择乘法更优。用一个布尔值记录\(x\)是否已经大于1,这样避免取模操作后\(x\)小于1的情况。

代码

void solve() {
    int n;
    cin >> n;

    ll ans = 0;
    bool ok = true;
    for(ll i = 0, x; i < n; i++) {
        cin >> x;
        if(ok || x == 1 || x == 0) {
            ans += x;
            if(ans > 1) ok = false;
            ans %= mod;
        } else {
            ans = (ans * x) % mod;
        }
    }

    cout << ans << "\n";
}

E. 括号序列操作专家

E-括号序列操作专家_牛客小白月赛76 (nowcoder.com)

题意

给定一个只包含左括号和右括号的字符串,成括号序列是合法的当可应通过插入加号和数字得到一个算术表达式。定义一次操作为交换相邻的两个括号,求使得序列变得合法最少所需的操作。

思路

对于每个没有匹配的右括号,把往后所遇到的第一个右左括号与之匹配,这种策略是最优的。

代码

void solve() {
    int n;
    string s;
    cin >> n >> s;
 
    int cnt = 0;
    for(int i = 0; i < n; i++) {
        if(s[i] == ')') cnt++;
    }
 
    if(cnt * 2 != n) {
        cout << -1 << "\n";
        return;
    }
     
    cnt = 0;
    ll ans = 0;
    for(int i = 0; i < n; i++) {
        if(s[i] == ')') {
            cnt++;
        } else {
            if(cnt > 0) ans += cnt;
            cnt--;
        }
    }
 
    cout << ans << "\n";
}
posted @ 2023-07-15 02:15  wuyoudexian  阅读(52)  评论(0)    收藏  举报