CF896B. Ithea Plays With Chtholly
前言
- wang79:那个 \(ODT\) 不是 \(CF\) 的一场比赛吗
- msjing:欸这场的 \(B\) 是不是 \(Interaction\) 啊,正好学了写一下
- 这题能推荐,不过估计大家都写过。。。
\(solve\)
- 我们尝试从前向后模拟一下,但是这样显然不太行

- 爆掉了
- 我们尝试进行改进,由于我们仅仅是填数,考虑从前面和后面同时下手,大的从后填,小的从前填
- 这样是对的
- 神奇吧
- 不过这个正确性需要一个阈值的保证,我们设为 \(\left\lfloor\dfrac c2\right\rfloor\)
- 我们考虑为什么这样做是对的
证明
- 设阈值为 \(g\),总共数范围为 \([1,c]\)
- 首先,每个空都要填,总共 \(n\) 个
- 然后,一个空最多被卡 \(g-1\) 次
- 如果阈值为 \(g=c\),那最多被卡 \(n \times c\)
- 由于我们取阈值为 \(g = \left\lfloor\dfrac c2\right\rfloor\),所以最多被卡 \(n \times \left\lfloor\dfrac c2\right\rfloor\),而 \(m \ge n \times \left\lceil\dfrac c2\right\rceil\),能过
点击查看代码
#include<bits/stdc++.h>
#define Honkai ios::sync_with_stdio(0);
#define StarRail cin.tie(0);cout.tie(0);
using namespace std;
constexpr int maxn=1010;
int a[maxn];
int main()
{
Honkai StarRail
int n,m,c;
cin >> n >> m >> c;
for (int I=1;I<=m;I++)
{
int x;cin >> x;
if (x<=c/2)
{
for (int i=1;i<=n;i++)
if (!a[i] || a[i]>x)
{
cout << i << endl;
a[i]=x;
break;
}
}
else
{
for (int i=n;i>=1;i--)
if (!a[i] || a[i]<x)
{
cout << i << endl;
a[i]=x;
break;
}
}
}
return 0;
}
$\mathscr{msjing}$

浙公网安备 33010602011771号