AtCoder Regular Contest 128 (AB)

A - Gold and Silver

官方题解简直yyds 官方题解

但是官方题解的代码不是C++,还是附上C++代码吧

int a[N], ans[N];
int main()
{
    IOS;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n - 1; i++)
    {
        //这里的异或运算简直不要太完美,自己品味理解最好
        if (a[i] > a[i + 1])
        {
            ans[i] ^= 1;
            ans[i + 1] ^= 1;
        }
    }
    for (int i = 0; i < n; i ++ ) cout << ans[i] << " ";
        return 0;
}

B - Balls of Three Colors

官方题解(实在是想不出来)

这题的关键就是能够发现只有两种颜色的数量差是3的倍数时,那么这两种颜色就能完全变成另外一种颜色

根据R,G,B -> R-1,G-1,B+2,我们会发现,任意两个数的差值对3取余的余数没有发生改变,所以最后变为0的两个数一开始的差值一定是3的倍数

我们假设abs(R-B)%3==0, 并且R > B,那么可以进行如下操作将R和B转化为G

  1. 将R和B转化为G,操作B次, 此时B变为0,R为3的倍数
  2. 然后再进行如下操作R次
    1. 将R和G转化为B
    2. 将R和B转化为G
    3. 将R和B转化为G

总共需要的次数也就是B + (R-B) 即R次

最后再判断其他情况的答案取最小值即可

int ans = inf;
inline void solve(int R, int G)
{
    int b = max(R, G);
    ans = min(ans, b);
}
int main()
{
    IOS;
    int T;
    cin >> T;
    while (T--)
    {
        ans = inf;
        int r, g, b;
        cin >> r >> g >> b;
        if (abs(r - g) % 3 == 0) solve(r, g);
        if (abs(r - b) % 3 == 0) solve(r, b);
        if (abs(g - b) % 3 == 0) solve(g, b);
        if (ans == inf) cout << "-1\n";
        else cout << ans << "\n";
        
    }
    return 0;
}

你可能感兴趣的:(题解,ios)