CF896B. Ithea Plays With Chtholly

前言

  • wang79:那个 \(ODT\) 不是 \(CF\) 的一场比赛吗
  • msjing:欸这场的 \(B\) 是不是 \(Interaction\) 啊,正好学了写一下
  • 这题能推荐,不过估计大家都写过。。。

\(solve\)

  • 我们尝试从前向后模拟一下,但是这样显然不太行

2026-09-24 21-06-52屏幕截图

  • 爆掉了
  • 我们尝试进行改进,由于我们仅仅是填数,考虑从前面和后面同时下手,大的从后填,小的从前填
  • 这样是对的
  • 神奇吧
  • 不过这个正确性需要一个阈值的保证,我们设为 \(\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;
}
posted @ 2026-09-24 21:24  msjing  阅读(11)  评论(0)    收藏  举报