首页 > 其他分享 >CW 11.15 模拟赛记录

CW 11.15 模拟赛记录

时间:2024-11-15 11:30:48浏览次数:1  
标签:min text 11.15 Cost 模拟 字符串 rm CW dp

看到说不按题目难度排序, 先读下题

初看

\(\rm{T1}\) 没什么思路

\(\rm{T2}\) 感觉像是 \(\rm{dp}\) , 可能能多骗点?

\(\rm{T3}\) 又是计数

\(\rm{T4}\) 没思路

感觉要寄, \(\rm{lhs}\) 多半又要 \(\rm{AK}\)

\(\rm{T2}\)

观察到这个类型的题比较熟, 先开 \(\rm{T2}\)

简化题意

给定一长为 \(n\) 的字符串 \(S\) , 由前 \(m\) 个小写字母构成, 现在要求将这个字符串变换成一个由至少连续 \(k\) 个相同字符构成的字符串组成的字符串( 下称为 合法字符串 ), 其中, 字符 \(a \to b\) 的花费为 \(W_{a, b}\)

显然的, \(W_{a, b}\) 的计算可以用 \(\rm{Floyd}\) 进行 \(O(m^3)\) 的计算

考虑状态转移方程的设计

令 \(dp_{i, p}\) 表示字符串到 \(i\) 结尾时, 当前的结尾字符为 \(p\) , 令其为合法字符串的最小花费

则有

  • 跟上之前的染色, 不需要考虑长度
  • 自己单独拉出来进行染色, 长度至少为 \(k\)

\[\left\{ \begin{array}{lr} dp_{i, p} = \min\left[ dp_{i - 1, p} + \rm{Cost} ( { S_{i \sim i} \to p }), dp_{i, p} \right] \text{ }, \text{ } j < i \text{ }, & \\ dp_{i, p} = \min\left[ dp_{j, q} + \rm{Cost} ( { S_{j + 1 \sim i} \to p } ) \right] \text{ }, \text{ } j \leq i - k \text{ } \end{array} \right. \]

时间复杂度 \(O(n m^2)\) , 需要预处理 \(\rm{Cost}\) , 前缀和做一下就可以了, 转移 \(O(1)\), 预处理 \(O(nm)\)

现在问题转化成了如何高效的找

\[\min\left[ dp_{j, q} + \rm{Cost} ( { S_{j + 1 \sim i} \to p } ) \right] \text{ }, \text{ } j \leq i - k \]

观察到 \(Cost\) 的可拆性

维护 \(g_{x, p} = \min_{i = 1}^{x} (dp_{i, p} + \rm{Cost}(S_{i + 1 \sim x} \to p))\)

那么转移就显然了, 每次计算的仅仅是 \(g_{i - k, p} + \rm{Cost}(S_{i - k + 1, i} \to p)\)

对于 \(g\) 的转移, 有

\[g_{i, p} = \min (g_{i - 1, p} + \rm{Cost}(S_{i, i} \to p), dp_{i, p}) \]

最外层显然需要先枚举 \(p\) , 里面枚举 \(i, q\)

这个时候已经过去 \(50 \rm{min}\) 了, 完蛋, 希望别假

先不打代码去看看 \(\rm{T1}\) , 防止一会脑子糊了做不出, 代码什么的艹过去就行了

确实多练 \(\rm{dp}\) 是好的

\(\rm{T1}\)

观察到康凌睿说这题是个 \(\rm{dp}\) , 往这个方向想

\(\rm{lhs}\) 说他没思路? 多半又要 \(\rm{AK}\)

往好的方向想, 至少对于 \(30\%\) 的数据, 我们可以状态压缩艹过去, 对于 \(60\%\) 的数据, 我们可以剪枝艹过去, 剩下 \(40 \rm{pts}\) 大不了不要了

我是删除线仙人

\(1 \rm{h} 20 \rm{min}\) 之后就放掉这道题去做后面的了, 有时间再看

\(\rm{T3}\)

简化题意,

每次让 \(i\) 位置的人位移到 \(A_i\) , 求能够使 \(k\) 次口令后回到原位的 \(A\) 排列

这个题好像之前的一道题

手玩样例找下性质, 然而并没有

直接观察大样例, 包没有性质的啊

再次跳题, 多半也没时间回来想了

\(\rm{T4}\)

从好的角度来想, 这个题至少题意清楚

显然的, 我们可以 \(O(n^2)\) 的计算出两两飞船之间唯一一次可以跳跃的机会时间, 这是简单的

对于 \(n^2\) 个时刻 (必须是排好序的), 每一次都可以更新最优解

这个复杂度大概是 \(O(n^2 \log n)\) 的, 可能可以通过 \(50\%\) 的数据

代码

现在还有 \(1 \rm{h} 45 \rm{min}\) , 最高可以拿到 \(60 + 100 + 0 + 50 = 210 \rm{pts}\), 但是最低只有 \(30 + 0 + 0 + 0 = 30 \rm{pts}\) 就看算法正确性和接下来的安排了

\(\rm{T1}\)

先打最为暴力和保险的 \(\rm{T1}\)

#include <bits/stdc++.h>
#include <bits/stdc++.h>
const int MAXN = 1020;
#define InMap(a, b) a >= 1 && a <= n && b >= 1 && b <= n

int n;
int W[MAXN][MAXN];

class Subtask_AB_Class
{
private:
    int Now[MAXN][MAXN]; //0 A; 1 B
    int Ans = 0;

    /*检查以 (x, y) 为右下角的 2 * 2 正方形的合法性*/
    bool Check(int x, int y)
    {
        if (InMap(x - 1, y - 1)) {
            int CntA = 0, CntB = 0;
            for (int i = x - 1; i <= x; i++)
                for (int j = y - 1; j <= y; j++)
                    CntA += int(Now[i][j] == 0), CntB += int(Now[i][j] == 1);
            if (CntA == CntB) return true;
            else return false;
        }else {
            return true;
        }

        return true;
    }

    int CalcAns()
    {
        int NowAns = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (Now[i][j] == 0) NowAns += W[i][j];
            
        return NowAns;
    }

    void dfs(int x, int y)
    {
        if (x == n && y == n) {
            if(Check(n, n))
                Ans = std::max(Ans, CalcAns());

            return;
        }

        if (!Check(x, y)) return;

        if (y != n) {
            Now[x][y + 1] = 0;
            dfs(x, y + 1);
            Now[x][y + 1] = 1;
            dfs(x, y + 1);
        }else {
            Now[x + 1][1] = 0;
            dfs(x + 1, 1);
            Now[x + 1][1] = 1;
            dfs(x + 1, 1);
        }
    }

public:
    void solve()
    {
        dfs(1, 0);
        printf("%d", Ans);
    }
} Subtask_AB;

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            scanf("%d", &W[i][j]);

    Subtask_AB.solve();

    return 0;
}

花了 \(25 \rm{min}\) 打, 一遍过并且惊人的快

\(\rm{T2}\)

这个题是正解, 但是实现稍微复杂, 尽可能快但是要保证正确

大不了放弃 \(\rm{T4}\)

神经, 写一半发现复杂度算错了, 极限优化

现在还剩下 \(40 \rm{min}\) 左右, 看看能不能拼出来这 \(100 \rm{pts}\)

大结局

最后死磕 \(\rm{T2}\) 转移和优化应该是对的, 没打出来, 遗憾趋势

预计 : $ 60 + 0 + 0 + 0 = 60 \rm{pts}$

实际 :

标签:min,text,11.15,Cost,模拟,字符串,rm,CW,dp
From: https://www.cnblogs.com/YzaCsp/p/18547637

相关文章

  • 2024.11.15 springsecurity执行力逻辑
    @Configuration@RequiredArgsConstructorpublicclassSecurityConfiguration{privatefinalSecurityHandlersecurityHandler;privatefinalJwtAuthorizeFilterjwtAuthorizeFilter;@BeanpublicPasswordEncoderpasswordEncoder(){re......
  • 地面沉降数值模拟/三维地质建模数据处理技术应用
    地面沉降数值模拟实践技术应用与案例分析  目前,地面沉降问题是我国较为常见的环境地质问题,其巨大的破坏力严重影响城市建筑安全和交通轨道运行。围绕地面沉降的防控与治理,是工程地质、环境地质、轨道交通设计等相关技术人员十分关注的领域,而数值模拟技术是评估防控效果的有......
  • 冯梓轩2024.11.14模拟赛反思
    冯梓轩2024.11.14模拟赛反思今天算是把之前犯过的大多数错误都犯了一遍。其实主要问题还是出在T1上,当时一直在想能不能先将\(n\)转成三进制数,然后通过后续调整来将其变合法。但是这个思路想了接近3个半小时也不会做。中途我也没有尝试换一种思路,一直按照进制的方式去死磕,最......
  • 2025 --炼石计划-- 11 月 13 日 --NOIP 模拟赛 #20
    2025--炼石计划--11月13日--NOIP模拟赛#20T1邻间的骰子之舞签到题显然答案具有二分性,考虑二分答案。注意到每次有意义的复制会使长度翻倍,即最多复制\(60\)次,而粘贴则类似一个乘积的形式,check时可以枚举复制次数,此时则能知道粘贴次数,由和定平分时积最大得到最大长度......
  • NOIP 模拟赛 #20
    已经好久没写模拟赛题解了啊。。。A.邻间的骰子之舞一个结论,可以打表,每一次复制后跟的粘贴数量要尽量相同,差不超过1,所以枚举复制了几次,然后二分最大的出来答案小于\(n\)的数\(mid\),然后枚举多少个复制后的粘贴数为\(mid+1\),出来的答案可以\(O(1)\)算,大于\(n\)直接输出......
  • NOIP2024 前集训:MX 炼石计划 NOIP 模拟赛 20
    前言今天不知道为啥去打MX了,bug不少啊,包括但不限于赛时能通过自己主页看自己题过没过,赛时可以进入“补题”的比赛交从而直接成IOI赛制,文件还有点问题?0+100+12+0,T1读假题:\(\ge×,>√\),喜提爆零,但是本来就不会正解,我去我表都打出来了不知道二分??!?!!?不打T4是错误的,乱搞能得的分......
  • 241114 noip 模拟赛
    省流:\(90+100+20+10\)。t1t2花太久时间了。T1题意:给一张\(n\timesm\)的网格图,\((x,y)\)与\((x+1,y)\)的边为\(a_x+b_y\),\((x,y)\)与\((x,y+1)\)的边为\(c_x+d_y\)。求这张图的最小生成树的边权和。\(n,m\leq10^6\)。稍微画图注意到,一个点一定跟它......
  • [68] (炼石计划) NOIP 模拟赛 #20
    学了一个挺帅的MerMaid所以用一下MerMaid就是你们接下来会看到的好看小标题但是实际上它是用来画流程图的……flowchartTB A(邻间的骰子之舞) styleAcolor:#ffffff,fill:#00c0c0,stroke:#ffffff考虑每次复制以后一定会粘贴若干次(大于零,否则没有意义),因此将复制粘贴捆绑......
  • MX 2025--炼石计划 NOIP 模拟赛 #20
    打得抽象。T3,T4放俩难的板子。由于是MX的题,就不放题意了。邻间的骰子之舞发现复制操作不会超过\(64\)次,而粘贴操作肯定是越均匀越好,直接二分暴力跑就行了。点此查看代码#include<bits/stdc++.h>usingnamespacestd;#definerep(i,s,t,p)for(inti=s;i<=t;i+=p)#......
  • 【C++】STL--queue、deque、priority的模拟实现和应用
    目录1、queue的介绍1.2queue的常规操作 2、queue的模拟实现 3、priority_queue(优先级队列)的介绍和实现3.1priority_queue的使用 3.2 priority_queue的应用 3.3 priority_queue的模拟实现4、deque4.1deque的原理介绍4.2deque的缺陷4.3 为什么选择deque作......