【解题报告】Codeforces Round #354 (Div. 2)

Codeforces Round #686 (Div. 3) 解题报告 Codeforces Round #686 (Div. 3) A. Special Permutation Description 让你输出111 ~ nnn的一个排列aaa,并满足∀i∈[1,n],ai≠i\forall i \in [1, n], a_i \neq i∀i∈[1,n],ai​​=i Tutorial 如果nnn为偶数直接倒序输出即可,否则将中间的数字与开头或结尾进行交换 Solution #include <bits/stdc++.h> using namespace st 阅读详情

题目链接


A. Nicholas and Permutation(Codeforces 676A)

思路

显然,将最大值或最小值中的一个交换到数组的某一端(若不放在端点上,则放在更靠近端点的位置总能得到更优的解)能让最大值与最小值之间的距离最大。我们可以通过计算计算出最优的方法。但是因为只有四种组合(最小值最左,最小值最右,最大值最左,最大值最右),所以可以直接枚举组合,并更新最优解。

代码
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 110;
int n, b, c, minIdx, maxIdx, a[maxn];

int abs(int x) {
    return x > 0 ? x : -x;
}

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        if(a[i] == 1) {
            minIdx = i;
        }
        if(a[i] == n) {
            maxIdx = i;
        }
    }
    b = max(abs(minIdx - n), abs(minIdx - 1));
    c = max(abs(maxIdx - n), abs(maxIdx - 1));
    printf("%d\n", max(b, c));
    return 0;
}

B.Pyramid of Glasses(Codeforces 676B)

思路

因为 n≤10 ,所以酒杯的数量 num≤55 (等差数列求和)。这样的数量足以让我们用暴力的方法解决此题。首先最暴力的办法是每次往最顶端的酒杯倒一杯酒,然后就循环或递归访问每个酒杯,以计算出每个酒杯的酒的余量。其次比较不那么暴力的方法是一次性把所有的酒倒进最顶端的酒杯中,然后也是循环或递归访问每个酒杯,以计算出每个酒杯的余量。显然,相比之下,不论在时间复杂度还是在实现复杂度上,后者会优于前者。但前者更容易被想到。

代码
#include <bits/stdc++.h>
using namespace std;

const int maxn = 15;
const double eps = 1e-10;
int n, t, cnt;
double h[maxn][maxn];

int cmp(double x) {
    return x < - eps ? -1 : x > eps;
}

void dfs(int x, int y, double come) {
    if(x > n) {
        return;
    }
    if(cmp(come) == 0) {
        return;
    }
    if(cmp(h[x][y] - 1) == 0) {
        dfs(x + 1, y, come / 2);
        dfs(x + 1, y + 1, come / 2);        
    }
    else {
        if(cmp(h[x][y] + come - 1) < 0) {
            h[x][y] += come;
        }
        else {
            int to = h[x][y] + come - 1;
            cnt++;
            h[x][y] = 1;
            dfs(x + 1, y, to / 2);
            dfs(x + 1, y + 1, to / 2);
        }
    }
}

int main() {
    scanf("%d%d", &n, &t);
    cnt = 0;
    while(t--) {
        dfs(1, 1, 1.0);
    }
    printf("%d\n", cnt);
    return 0;
}

C. Vasya and String(Codeforces 676C)

思路

刚开始一直往动态规划那方面想,所以浪费了不少时间。但实际上本题从“枚举子串”的方面想才是对的(看来凡事还是先上暴力思维会比较不容易走偏)。我们可以先以 O(n2) 的复杂度枚举出子串,然后以 O(n) 的复杂度计算出该子串是否能通过 k 次“改变”变成字符统一的字符串。在枚举中更新满足条件的子串的最大长度即可。但是 O(n3) 的总复杂度是不发承受的,那么我们能不能仅 O(n) 地扫描一遍字符串就完成上述全部工作呢?事实上是可以的。假如 s 的子串 s[p..q] 是满足条件的字符串,而 s[p..q+1] 是不满足条件的字符串,那么下一步应当是令 p=p+1 且 q=p (枚举以新的 p 开头的子串)。实际上,这样使得集合 {s[p+1..j],p+1≤j≤q} 中的全部字符串都重复枚举了(因为不可能得到更优解)。也就是说尾指针 q 的回溯是没必要的。这种利用无法达到最优解的特性避免回溯尾指针的枚举子串的方法就是“尺取法”(名字取自《挑战程序设计竞赛》)。这样我们用 O(n) 的复杂度枚举子串,然后在头尾指针移动的过程中动态更新子串中 a 的数量 sa 和 b 的数量 sb (因为“尺取法”有每次只用让指针移动一个字符),根据 min(sa,sb) 同 k 的关系来判断子串是否满足条件并更新答案,题目得解。

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 5;
char s[maxn];
int n, k, l, r, sa, sb, ans = 0;

int main() {
    scanf("%d%d%s", &n, &k, s);
    sa = (s[l=0] == 'a');
    sb = (s[r=0] == 'b');
    while(r < n) {
        if(sa <= k || sb <= k) {
            ans = max(ans, r - l + 1);
        }
        else {
            sa -= (s[l] == 'a');
            sb -= (s[l++] == 'b');
        }
        sa += (s[++r] == 'a');
        sb += (s[r] == 'b');        
    }
    printf("%d\n", ans);
    return 0;
}

D. Theseus and labyrinth(Codeforces 676D)

思路

若没有方块的旋转,则这个问题就是简单的用 BFS 求最短步数的问题。现在有了旋转,相当于总共有 4 个 n×m 的网格,分别对应着原来的网格不旋转 (s=0) ,旋转 1 次 (s=1) ,旋转 2 次 (s=2) 和旋转 3 次 (s=3) 的情况。那么我们可以将这 4 个网格看成三维的网格,也就是说可以将状态空间看成 n×m×4 的三维空间。那么主人公处在某个状态 (x,y,s) 的时候可以向五个方向移动,分别为上 (x−1,y,s) ,下 (x+1,y,s) ,左 (x,y−1,s) ,右 (x,y+1,s) 和旋转1次 (x,y,(s+1)mod4) ,而且每次移动的代价都是相同的(等待 1 秒)。设计好状态以后在三维空间内用 BFS 求最短步数即可。另外还有一个小问题,就是如何简洁而快速地判断是否能向某个方向移动。我们可以建立一个映射 b[u]=v ,表示当方块里的内容为 u 时,向上右下左(不是上下左右)四个方向移动是否可行(将四个方向的信息压缩成整数 v ),为此我们要将上右下左四个方向分别编号为 0,1,2,3 。例如 b[′+′]=15 (二进制表示为 1111 )表示当方块的内容为 ‘+′ 时上右下左四个方向都能移动。 b[′>′]=1<<2 (二进制表示为 0010 )表示只能向右移动,为什么要向左移动2位呢?因为“右”的编号为 2 。这样,知道了方方块内的内容和移动的方向就能知道向这个方向移动是否可行。

代码
#include <bits/stdc++.h>
using namespace std;

// 搜索树中的节点
struct node {
    int x, y, s, d;
    node(int x, int y, int s, int d): x(x), y(y), s(s), d(d) {}
};

const int maxn = 1010;
// 上右下左四个方向的坐标变化 
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
// 判重用的数组
bool vis[maxn][maxn][5];
char G[maxn][maxn];
int n, m, sx, sy, tx, ty, b[150];
queue <node> q;

// 初始化映射
void init() {
    b['^'] = 1 << 0;
    b['>'] = 1 << 1;
    b['v'] = 1 << 2;
    b['<'] = 1 << 3;
    b['L'] = ~b['<'];
    b['R'] = ~b['>'];
    b['U'] = ~b['^'];
    b['D'] = ~b['v'];
    b['-'] =  b['<'] | b['>'];
    b['|'] =  b['^'] | b['v'];
    b['+'] =  b['|'] | b['-'];
}

// 状态的转移
void expand(node& u, int dir) {
    int x, y, s, d, i, j;
    if(dir == -1) {
        x = u.x;
        y = u.y;
        s = (u.s + 1) % 4;
        d = u.d + 1;
        if(vis[x][y][s]) {
            return;
        }
        q.push(node(x, y, s, d));
        vis[x][y][s] = true;
    }
    else {
        // 判断本方块往dir方向是否有通路
        i = b[G[u.x][u.y]];
        j = 1 << ((dir - u.s + 4) % 4);
        if((i & j) == 0) {
            return;
        }
        x = u.x + dx[dir];
        y = u.y + dy[dir];
        s = u.s;
        d = u.d + 1;
        // 防止访问越界
        if(x < 1 || x > n || y < 1 || y > m) {
            return;
        }
        // BFS的判重
        if(vis[x][y][s]) {
            return;
        }
        // 判断新方块的dir方向的反方向是否有通路
        i = b[G[x][y]];
        j = 1 << ((dir + 2 - s + 4) % 4);
        if((i & j) == 0) {
            return;
        }
        q.push(node(x, y, s, d));
        vis[x][y][s] = true;
    }
} 

int bfs(node s) {
    q.push(s);
    while(!q.empty()) {
        node u = q.front();
        q.pop();
        if(u.x == tx && u.y == ty) {
            return u.d;
        }
        // 共有5种方式向BFS的队列加入新的节点
        // 0, 1, 2, 3分别表示上右下左4个方向 
        // -1表示所有的方块顺时针方向旋转90度
        for(int i = -1; i < 4; i++) {
            expand(u, i);
        }
    }
    return -1;
}

int main() {
    init();
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++) {
        scanf("%s", G[i] + 1);
    }
    scanf("%d%d%d%d", &sx, &sy, &tx, &ty);
    vis[sx][sy][0] = true;
    printf("%d\n", bfs(node(sx, sy, 0, 0)));
    return 0;
}

(其它题目略)

Codeforces Round #343 (Div. 2) 解题报告 Codeforces Round #343 (Div. 2) 阅读详情

相关推荐

【解题报告】Codeforces Round #344 (Div. 2)

简略的解题报告。

TRiddle的博客 1017

Codeforces Round #653 (Div. 3)解题报告

Codeforces Round #653 (Div. 3) A~E1解题报告,含机翻、思路、代码。

Visors的博客 706

【解题报告】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)

简略的解题报告。

TRiddle的博客 1579

Codeforces Round #354 (Div. 2)

Codeforces Round #354 (Div. 2)

queuelovestack的专栏 3182

【解题报告】Codeforces Round #301 (Div. 2)

简略的解题报告。

TRiddle的博客 672

【解题报告】Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)

简略的解题报告。

TRiddle的博客 907

Codeforces Round #655 (Div. 2)解题报告

文章目录Codeforces Round #655 (Div. 2)解题报告A - Omkar and Completion思路代码B - Omkar and Last Class of Math思路代码 Codeforces Round #655 (Div. 2)解题报告 A - Omkar and Completion 思路 一开始还在思考怎么构造,然后通篇没看见说构造的元素不能重复,那就全1好了…… 代码 // // Created by Visors on 2020/7/11. // #inclu

Visors的博客 473

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

Codeforces Round #545 (Div. 2) 解题报告

Codeforces Round #545 (Div. 2) 文章目录Codeforces Round #545 (Div. 2)[B. Circus](https://codeforces.ml/contest/1138/problem/B)题目大意:解题思路:AC代码:[C. Skyscrapers](https://codeforces.ml/contest/1138/problem/C)题目大意:解题思路:AC代码:D. Camp Schedule题目大意:解题思路:AC代码: B. Circus

trouble_的博客 501

VLA模型(具身智能入门十)

Vision Language Action(VLA)模型VLA模型是机器人领域的“感知-理解-执行”一体化框架,通过Transformer架构融合视觉、语言、动作模态,核心目标是让机器人在自然语言驱动下,自主完成复杂操控任务。其定义的核心在于“跨模态统一”与“具象化行动”——不仅能“看懂”“听懂”,更能“做出正确的动作”,是实现通用机器人智能的关键方向。提供通用序列建模骨架,让视觉、语言、动作能以“序列”形式统一处理;ViT将视觉输入转换为序列特征,提供“看”的能力;LLMs。

weixin_39699362的博客 9927

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1397

【解题报告】Codeforces Round #363 (Div. 2)

简略的解题报告。

TRiddle的博客 1132

Basler相机和pylon viewer 的使用

文章目录1 线路连接2 安装和使用pylon 1 线路连接 电源线接到电源插座,网线接到电脑(电脑没有网口的话,可用转换器转到type-c接口)。 2 安装和使用pylon 参考 Basler pylon安装及对网口相机基本设置 相机和电脑以太网IP设置参考:balser相机IP设置 关于相机参数和pylon viewer的详细设置,可以参考pylon Viewer安装路径下的文档(Documentation) ...

Deephome的博客 1万+

Codeforces Round #269 (Div. 2) A~D

这次的CF除了最后一个都比较简单, 第一次用JAVA写CF....... Codeforces Round #269 (Div. 2) A. MUH and Sticks time limit per test 1 second memory limit per test 256 megabytes input

码代码的猿猿 2235

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4729

【OpenClaw企业级智能体实战】第27篇:Skill生态运营——企业私有Skill商店的搭建与审核机制

2026年ClawHavoc供应链攻击事件曝光超1200个恶意Skill渗透公共技能市场,工信部明确要求企业审慎使用第三方技能包并严格审查代码。本文基于真实安全事件与行业实践,完整讲解企业私有Skill商店从0到1搭建方案,覆盖小团队极简GitLab私有仓库、中大型企业Nacos 3.2私有Registry两种主流架构,配套企业级安全审核四步法、静态代码扫描规则、CI/CD自动化审计、数字签名校验与版本生命周期管理。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 499

Codeforces Beta Round #46 (Div. 2) E. Common ancestor

题意     定义变换:ai->bici :表示把字符串中的ai 字符变成bici 字符。再定义两个字符串 s1 s2 的公共祖先 s3:s1 s2 能够由 s3 经过一些变换分别得到。现在给你两个长度不超过 50 的字符串,问你他们的公共祖先中长度最短的是多少,输出这个最短长度。 做法分析     动态规划,如果我们知道了每个字符串中从第 i 个位置到第 j 个位置能否变成某个特定

蛤蛤~ 1万+

RT-DETR改进策略【Conv和Transformer】| HiLo注意力机制 通过分离处理图像的高频和低频信息,高效处理图像特征

本文记录的是利用改进检测模型,针对目标检测中面临的多尺度特征融合效率与长距离依赖建模难题,HiLo注意力模块的引入旨在通过频率解耦策略优化高分辨率特征处理,将高频细节(如目标边缘)与低频语义(如场景结构)分离建模,提升目标检测精度。Fast Vision Transformers with HiLo AttentionHiLo注意力模块的提出源于对传统自注意力机制局限性的反思。传统多头自注意力(MSA)在处理高分辨率图像时存在以下问题:HiLo将注意力模块分为高频(Hi-Fi)和低频(Lo-Fi)两个分支,

Limiiiing的博客 818

Codeforces Round #645 (Div. 2)解题报告

Codeforces Round #645 (Div. 2) A.Park Lighting 题目大意 给你一个由n * m个方块组成的小区,每两个方块相交的边视为街道,一个街道上的灯可以照亮与其相邻的方块,问你最少点亮多少个街道的灯可以使所有方块全部亮起 解题思路 一开始想的是n和m根据奇偶分为4种情况,可以A,但是更好的思路是有n * m个方块需要点亮,一盏灯最多可以点亮两个方块,那么答案就是[(n * m) / 2] = (n * m + 1) / 2([]表示向上取整) AC代码 #include

weixin_44211980的博客 333

重回童年的经典系列☀️| 【坦克大战3D版】游戏制作+解析

带你重回童年的经典系列——坦克大战3D版制作,感兴趣的可以看看呀~

努力前行,总会成为自己心中的那道光 5万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Codeforces Round #537 (Div. 2)解题报告

第一题:(模拟) #include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cmath&gt; #include&lt;cstdio&gt; using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)&lt;(z);...

满月照亮的路 446

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Codeforces Round #626(Div.2) 解题报告

Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) 【前言】 最近沉迷只狼,好久没有打CF了,水平下降了不少,昨天打完修罗结局今天搞了一个Div2练练手,没想到是真的菜。。。(虽然我一直都挺菜),看来还是得经常做题啊 【A.Even Subset Sum Problem】 【题目大意】 给你一个序...

weixin_44211980的博客 258

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces Round #363 (Div. 2) 题解报告

Codeforces Round #363 (Div. 2) 题解报告

queuelovestack的专栏 1798

Codeforces Round #777 (Div. 2) 简训

Codeforces Round #777 (Div. 2) 简训 日常训练,D题的分类很繁琐

C_eeking的博客 2059

Codeforces Round #620 (Div. 2)解题报告

Codeforces Round #620 (Div. 2) 【A.Two Rabbits】 【题目描述】 水题,给你一维坐标x和y,y > x,每次y - b,x + a,问x和y能否相遇 【解题思路】 x + ta = y - tb t = (y - x) / (a + b) 那么相遇的条件是(y - x) % (a + b) == 0 【AC代码】 #include <bits/...

weixin_44211980的博客 248

Codeforces Round #700 (Div. 2)A~D2解题报告

Codeforces Round #700 (Div. 2)A~D2解题报告 A Yet Another String Game 原题链接 http://codeforces.com/contest/1480/problem/A 解题思路 Alice想让更小,先手 Bob想让其更大,后手 解决方案当然是贪心,从第一个排到最后一个 如果不是选择当前未更改的第一个,那么被别人修改,那么就会往反方向走了 AC代码 #include <bits/stdc++.h> using namespace

weixin_45573921的博客 584
上一篇: 【解题报告】2014ACM/ICPC亚洲区广州站
下一篇: 【解题报告】Codeforces Round #302 (Div. 2)
TRiddle
博客等级 码龄11年 14粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值