返回顶部

Codeforces Round 908 (Div. 2)

A. Secret Sport

思路:

当游戏出现时,游戏会结束,所以序列最后一个谁赢,谁就是总的赢家

code:

void solved()
{
    cin >> n;
    char c;
    for (int i = 1; i <= n; ++i)
    {
        cin >> c;
    }
    cout << c << endl;
}

B. Two Out of Three

思路:

同一个数不能只满足两个条件,满足两个条件必然满足第三个条件,所以必须有两种重复的数

对于所有数的第一次出现输出\(1\),对于出现次数最多的重复数输出\(2\),其余数都输出\(3\)

即可满足上述条件

code:

int n, a[N];
void solved()
{
    cin >> n;
    int vis[N] = {0};
    int cnt = 0;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        if (vis[a[i]] == 1)
        {
            cnt++;
        }
        vis[a[i]]++;
    }
    if (cnt <= 1)
    {
        cout << -1 << endl;
    }
    else
    {
        int op = max_element(vis + 1, vis + 101) - vis;
        int book[N] = {0};
        // cout << op << endl;
        for (int i = 1; i <= n; ++i)
        {
            if (book[a[i]] == 0)
            {
                cout << 1 << " ";
                book[a[i]] = 1;
            }
            else
            {
                if (a[i] == op)
                    cout << 2 << " ";
                else
                    cout << 3 << " ";
            }
        }
        cout << endl;
    }
}

C. Anonymous Informant

思路:

首先定点不能是大于\(n\)的数,上一次定点一定为每次循环序列的最后一个数

依次循环保留所有定点,若循环到已经循环过的定点说明进入了循环,则说明所有的定点已经找完

定点的迭代公式:\(x_{i+1}=(x_i-b[x_i]+n)\%n\)

code:

int n, k, b[N] = {0};
void solved()
{
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        cin >> b[i];
    }
    vector<pair<int, int>> a;
    int num = 0, pos = n;
    int vis[n + 1] = {0};
    while (num != k)
    {
        if (vis[pos] == 0)
        {
            vis[pos] = 1;
            a.push_back({b[pos], pos});

            if (b[pos] > n)
            {
                cout << "NO" << endl;
                return;
            }
            pos = (pos - b[pos] + n) % n;
            num++;
        }
        else
        {
            break;
        }
    }
    k = k % n;
    cout << "YES" << endl;
}

D. Neutral Tonality

思路:

\(LSC\)的值最小即让序列尽可能保持一个”递减序列“

对于\(b\)降序排列,对于每个\(b_i\)让其插入到第一个小于它的\(a_i\)前面

code:

int n, m;
int a[N], b[N];
bool cmp(int x, int y)
{
    return x > y;
}
void solved()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> a[i];
    for (int i = 1; i <= m; ++i)
        cin >> b[i];
    sort(b + 1, b + 1 + m, cmp);
    int i = 1, j = 1;
    while (i <= n || j <= m)
    {
        if ((b[j] > a[i] && j <= m) || i > n)
        {
            cout << b[j] << " ";
            j++;
        }
        else
        {
            cout << a[i] << " ";
            i++;
        }
    }
    cout << endl;
}
posted @ 2023-11-09 22:35  bhxyry  阅读(15)  评论(0)    收藏  举报