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;
}

浙公网安备 33010602011771号