cf -1083-div3前五题思路

A Eating Game

其实就是找最大值一共有几个

void solve()
{
    int mx = 0;
    cin >> n;
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        if (x > mx)
        {
            mx = x;
            cnt = 1;
        }
        else if (x == mx)
            cnt++;
    }
    cout << cnt << endl;
}

B Deletion sort

很显然的遍历数组,如果能找到一组逆序对,那么可以先把其他所有元素都删掉,然后这两个数随便删一个,这样操作必然剩一个,如果不能找到逆序对,那么就不能删。

void solve()
{
    cin >> n;
    bool ok = 1;
    vi a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (a[i] < a[i - 1] && i != 1)
        {
            ok = 0;
        }
    }
    if (!ok)
    {
        cout << 1 << endl;
    }
    else
    {
        cout << n << endl;
    }
}

C Specialty String

可以像括号序列那样来做,因为如果能变星号的话,一定是一对一对的变,所以这种对子可以互相消除,可以认为如果栈顶和入栈元素相同,那么就可以消除,如果全消除了,就说明全为‘*’了。

void solve()
{
    cin >> n;
    cin >> s;
    stack<char> p;
    for (int i = 0; i < n; i++)
    {
        if (!p.empty() && p.top() == s[i])
        {
            p.pop();
        }
        else
        {
            p.push(s[i]);
        }
    }
    if (p.empty())
    {
        cout << "YES" << endl;
    }
    else
    {
        cout << "NO" << endl;
    }
}

D Portal

俩传送门,然后你左我右,你右我左这样传送。显然中间的可以循环重排,那么我们可以找到中间数组最小数,将最小数作为开头,一直到最后,然后再从开始到最小数前,这就是新的中间数组。再从剩下的里面找第一个大于中间数组最小值的数,将中间数组插到这个数前面就行了

void solve()
{
    cin >> n >> x >> y;
    vi a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    vi b, c;
    for (int i = x + 1; i <= y; i++)
    {
        b.push_back(a[i]);
    }
    int mi = 0;
    for (int i = 0; i < b.size(); i++)
    {
        if (b[i] < b[mi])
        {
            mi = i;
        }
    }
    vi tb;
    for (int i = mi; i < b.size(); i++)
    {
        tb.push_back(b[i]);
    }
    for (int i = 0; i < mi; i++)
    {
        tb.push_back(b[i]);
    }
    b = tb;
    for (int i = 1; i <= x; i++)
    {
        c.push_back(a[i]);
    }
    for (int i = y + 1; i <= n; i++)
    {
        c.push_back(a[i]);
    }
    int op = c.size();
    for (int i = 0; i < c.size(); i++)
    {
        if (c[i] > b[0])
        {
            op = i;
            break;
        }
    }
    for (int i = 0; i < op; i++)
    {
        cout << c[i] << " ";
    }
    for (int i = 0; i < b.size(); i++)
    {
        cout << b[i] << " ";
    }
    for (int i = op; i < c.size(); i++)
    {
        cout << c[i] << " ";
    }
    cout << endl;
}

E Divisive Battle

先判断一开始是否是非递减的,如果是bob就赢了。
想一下,如果一个数有两个或以上的质因数,可以把最小的质因数分解放在右面,这样无论怎么样Alice都赢了。
如果一个数只有一个质因数(质数的幂)或者说是1,那么他对结果的贡献就是这个质数或者1。
所以,构建一个新数组,分析每个元素是1,还是单质数的幂,还是有两个以上的质因数。
如果这个数组只有1,单质数的幂,那么直接看看新数组是不是非递减就行了,如果不是那么Alice就赢了。

void solve()
{
    cin >> n;
    vi a(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    vi b(n);
    for (int i = 0; i < n; i++)
    {
        b[i] = op(a[i]);
    }
    if (is_sorted(all(a)))
    {
        cout << "Bob" << endl;
    }
    else if (*min_element(all(b)) == -1)
    {
        cout << "Alice" << endl;
    }
    else if (is_sorted(all(b)))
    {
        cout << "Bob" << endl;
    }
    else
    {
        cout << "Alice" << endl;
    }
}

最后想写以前没咋用过的几个函数

*min_element(all(a)),找a数组最小元素

*max_element(all(a)),找a数组最大元素

fill(all(a),x),把所有元素设为x;

is_sort(all(a)),判断a数组是不是非递减的

posted @ 2026-02-28 15:42  Lambda_L  阅读(5)  评论(0)    收藏  举报