期末测试补题报告

目录

  • 1. 游戏机
  • 2. 序列操作
  • 3. 划分区间
  • 4. 数字匹配
  • 5. 地图移动

1. 游戏机

  • 赛时

    Accepted 100 \color{green}\texttt{Accepted 100} Accepted 100

  • 题目描述

    在一个长条形的区域里有 n n n 个格子,人物角色可以从任意一个格子出生,如果格子上是 L,则往左走一格;如果是 R,往右走一格。当角色走出区域时,即为获胜。

    求有多少个格子可以使角色一出生就能直接获胜。

  • 题解

    如果从左边走出区域,那么从这个格子(包括这个格子)一直到最左边的格子都是 L

    如果从右边走出区域,那么从这个格子(包括这个格子)一直到最右边的格子都是 R

  • 代码

    #include <bits/stdc++.h>
    #define endl '\n'
    using namespace std;
    int n;
    string s;
    int main() {CLOSE;while (cin >> n && n) {cin >> s;int ans = 0;for (int i = 0; i < s.size() && s[i] == 'L'; i++)ans++;for (int i = s.size() - 1; i >= 0 && s[i] == 'R'; i--)ans++;cout << ans << endl;}return 0;
    }
    

2. 序列操作

  • 赛时

    Accepted 100 \color{green}\texttt{Accepted 100} Accepted 100

  • 题目描述

    给定一个长度为 n n n 的序列 a a a,然后进行 q q q 次操作 ,然后打印 q q q 次操作后序列最小值的位置。

    • 操作一:输入方式为1 l r,表示将序列 [ l , r ] [l,r] [l,r] 区间的全部元素全部升序排列。

    • 操作二:输入方式为2 l r,表示将序列 [ l , r ] [l,r] [l,r] 区间的全部元素全部降序排列。

    • 操作三:输入方式为3 l r,表示将序列 [ l , r ] [l,r] [l,r] 区间的全部元素进行翻转。

    • 操作四:输入方式为4 l r k,表示将序列 [ l , r ] [l,r] [l,r] 区间的全部元素按照swap(a[i],a[i+k])规则进行交换。

  • 题解

    题目要求操作后最小值的位置,所以我们只需要跟踪最小值的位置 t t t 即可,其他的元素我们并不关心。

    • 操作一:显然,升序排列后最小值在最前面, t = l t=l t=l

    • 操作二:同理, t = r t=r t=r

    • 操作三:易得, t = l + r − t t=l+r-t t=l+rt

    • 操作四:找规律得
      t = { t − k ( l + k ≤ t ≤ r + k ) t + ⌊ r − t k + 1 ⌋ k ( l ≤ t < l + k ) t= \begin{cases} t - k &(l+k\le t\le r + k)\\ t+\lfloor\frac{r-t}{k}+1\rfloor k &(l\le t< l + k) \end{cases} t={tkt+krt+1k(l+ktr+k)(lt<l+k)

  • 代码

    #include <bits/stdc++.h>
    #define endl '\n'
    using namespace std;
    const int N = 2e5 + 10;
    int n, T, q, a[N];
    int main() {CLOSE;cin >> T;while (T--) {cin >> n >> q;int maxn = INT_MAX, t;for (int i = 1; i <= n; i++) {cin >> a[i];if (maxn > a[i]) {maxn = a[i];it = i;}}while (q--) {int k, l, r, op;cin >> op >> l >> r;if (op == 4)cin >> k;if (t >= l && t <= r) {if (op == 1) {t = l;} else if (op == 2) {t = r;} else if (op == 3) {t = l + r - t;}}if (op == 4) {if (t >= l && t <= r + k) {if (t >= l + k)t -= k;else t += ((r - t) / k + 1) * k;}}}cout << t << endl;}return 0;
    }
    

3. 划分区间

  • 赛时

    Wrong Answer 0 \color{red}{\texttt{Wrong Answer 0}} Wrong Answer 0

  • 题目描述

    给定一个包含 n n n 个区间的集合 S S S,请你将 S S S 划分为一个或多个区间,每个区间属于且仅属于一个区间组内, 同一个区间组内的任意两个区间不相交(区间相交指两个区间无重叠部分)。

    请问集合 S S S 最少可以划分为多少区间组?

  • 题解

    贪心。要想让一个区间组尽可能地放更多的区间,就要让区间之间的空隙尽可能地小。现有若干个区间组,要把当前区间组接到一个右端点离它左端点最近的区间组,这样可以使空隙变小。如果现有的区间组右端点都不小于当前区间的左端点,那么把当前区间独立成一个新的区间组。

    所以,不妨先把所有区间按照左端点排序,这样可以使区间右端点尽可能靠前,然后依次考虑每一个区间,每次找右端点最靠前的区间组,如果能放进去,就改变右端点;反之,就加入一个新的区间组。

  • AC代码

    #include <bits/stdc++.h>
    #define endl '\n'
    using namespace std;
    const int N = 1e5 + 10;
    int n;
    struct node{int l, r;bool operator<(const node& x) const {return l < x.l;}
    }a[N];
    priority_queue<int, vector<int>, greater<int>> q;  //小根堆,找最小右端点
    int main() {CLOSE;cin >> n;for (int i = 1; i <= n; i++) cin >> a[i].l >> a[i].r;sort (a + 1, a + n + 1);  //左端点排序for (int i = 1; i <= n; i++) {if (!q.empty() && q.top() < a[i].l) q.pop();q.push(a[i].r);}cout << q.size();return 0;
    }
    

4. 数字匹配

  • 赛时

    Runtime Error 30 \color{red}{\texttt{Runtime Error 30}} Runtime Error 30

  • 题目描述

    给定由 m m m 个长度都为 n n n ,仅包含 01 的字符串组成的集合 S S S,再给定 n n n 个整数组成的序列 w w w

    对于字符串 s s s 和字符串 t t t 的匹配收益定义为:
    ∑ i = 1 ∣ s i = t i n w i \sum_{i=1|s_i=t_i}^{n}w_i i=1∣si=tinwi
    进行 q q q 次询问,每次询问给定一个字符串 t t t 和一个整数 k k k,问集合 S S S 中有多少个字符串和 t t t 的匹配收益不多于 k k k

  • 题解

    数据范围太大,枚举必定超时。字符串仅包含 01 ,且 n n n 很小( n ≤ 12 n\le 12 n12),考虑状态压缩,把字符串看作一个二进制数,转换成十进制保存。

    对于两个字符串的匹配,如果对应位相同记为 0,不同记为 1,则可以得到一个“匹配串”,它的十进制是原来两个字符串十进制的异或值。通过异或值,我们可以把匹配受益求出来。

    如果在每次询问时都求一遍异或值,依然超时。考虑 n n n 很小,所以不妨预处理,把所有可能的询问字符串 t t t 和集合中的字符串 s s s 都两两匹配求一下匹配收益,然后使用数组f[t][k]求出当询问字符串为 t t t 时,匹配收益不大于 k k k 的集合中字符串 s s s 的个数。

    易得,数组 f[][] 满足:
    f ( t , k ) = f ( t , k ) + f ( t , k − 1 ) f(t, k) = f(t,k)+f(t,k-1) f(t,k)=f(t,k)+f(t,k1)

  • AC代码

    #include <bits/stdc++.h>
    #define endl '\n'
    using namespace std;
    const int N = 5e5 + 10;
    int n, m, q, w[N], bin[N], f[5000][200];
    string s[N];
    int getbin(string s) {int res = 0;for (int i = 0; i < n; i++)res = res * 2 + (s[i] - '0');return res;
    }
    int main() {CLOSE;cin >> n >> m >> q;for (int i = 1; i <= n; i++)cin >> w[i];for (int i = 1; i <= m; i++)cin >> s[i], bin[getbin(s[i])]++;  //记录s[i]的十进制int len = 1 << n;for (int i = 0; i < len; i++) {if (!bin[i]) continue;for (int j = 0; j < len; j++) {int x = i ^ j, cnt = 0;for (int l = n; l >= 1; l--) {  //求匹配效益cnt += (x % 2 == 0) * w[l];x /= 2;}if (cnt > 100) continue;f[j][cnt] += bin[i]; }}for (int i = 0; i < len; i++) for (int j = 1; j <= 100; j++) f[i][j] += f[i][j - 1];while (q--) {string t;int k;cin >> t >> k;int check = getbin(t);cout << f[check][k] << endl;}return 0;
    }
    

5. 地图移动

  • 赛时

    Runtime Error 0 \color{red}{\texttt{Runtime Error 0}} Runtime Error 0

  • 题目描述

    给定一个 h × w h\times w h×w 的矩阵地图,在地图上有些点是山或者其他障碍物,不可以通过,除此之外所有点都可以走。每次只能向下走或者向右走一步。

    计算,从左上角走到右下角总共有多少种移动方法。

  • 题解

    ( 1 , 1 ) (1,1) (1,1) ( x , y ) (x,y) (x,y) 的路径数为 C x + y − 2 y − 1 C_{x+y-2}^{y-1} Cx+y2y1

    不妨求出路径总数,再减去不能走的路径数。

    障碍点 ( i , j ) (i,j) (i,j) 到起点的路径数时 C i + j − 2 j − 1 C_{i+j-2}^{j-1} Ci+j2j1。但是,在实际计算不能走的路径数时有重复,比如存在路径同时经过两个或多个障碍点。因此,实际计算通过障碍点 ( i , j ) (i,j) (i,j) 的路径数时,应当减去重复的。

    先将障碍点按从左上到右下的顺序排序。

    f ( k ) f(k) f(k) 表示第 k k k 个障碍点, x x x y y y 表示行和列, n u m num num 表示障碍点 k k k 左上方的障碍点个数,则有:
    f ( k ) = C x k + y k − 2 y k − 1 − ∑ i = 1 n u m f ( i ) × C x k + y k − x i − y i y k − y i f(k)=C_{x_k+y_k-2}^{y_k-1}-\sum_{i=1}^{num}f(i)\times C_{x_k+y_k-x_i-y_i}^{y_k-y_i} f(k)=Cxk+yk2yk1i=1numf(i)×Cxk+ykxiyiykyi
    最后,终点的 f ( e n d ) f(end) f(end) 就是答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中介子方程十一

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiXrXkXtXyX$XpXαXpX$XyXtXkXrXiXαX$XiXαXy…

testbench仿真文件编写规则

编写TESTBENCH的目的是为了对使用硬件描述语言设计的电路进行仿真验证,测试设计电路的功能、性能与设计的预期是否相符。编写测试文件的过程如下: (1)产生模拟激励(波形); (2) 将产生的激励加入到被测试模块中并观察其响应; (3) 将输出响应与期望值相比较。 一,各…

李廉洋:6.10黄金原油非农之后,今日行情走势分析策略。

黄金消息面分析&#xff1a;即美联储不会在短期内以降息的方式出手纾困。该报告确实将首次降息的可能性推迟到了12月&#xff0c;但股市的反应不像多数交易商预期的那样。股市非但没有崩盘&#xff0c;反而随着交易员逢低买入而大幅反弹。很明显&#xff0c;市场完全专注于盈利…

Java(十七)---ArrayList的使用

文章目录 前言1.ArrayList的简介2. ArrayList使用2.1.ArrayList的构造2.2.ArrayList的扩容机制(JDK17) 3.ArrayList的常见操作4. ArrayList的具体使用4.1.[杨辉三角](https://leetcode.cn/problems/pascals-triangle/description/)4.2.简单的洗牌游戏 5.ArrayList的问题及思考 …

【数据结构】AVL树(平衡二叉树)

目录 一、AVL树的概念二、AVL树的节点三、AVL树的插入四、AVL树的旋转1.插入在较高左子树的左侧&#xff0c;使用右单旋2.插入在较高右子树的右侧&#xff0c;使用左单旋3.插入较高左子树的右侧&#xff0c;先左单旋再右单旋4.插入较高右子树的左侧&#xff0c;先右单旋再左单旋…

【Python核心数据结构探秘】:元组与字典的完美协奏曲

文章目录 &#x1f680;一、元组⭐1. 元组查询的相关方法❤️2. 坑点&#x1f3ac;3. 修改元组 &#x1f308;二、集合⭐1. 集合踩坑❤️2. 集合特点&#x1f4a5;无序性&#x1f4a5;唯一性 ☔3. 集合&#xff08;交&#xff0c;并&#xff0c;补&#xff09;&#x1f3ac;4. …

Python中的函数装饰器(function decorator)和类装饰器(class decorator)的区别。

在Python中&#xff0c;装饰器&#xff08;Decorators&#xff09;是一种强大的工具&#xff0c;它允许程序员在不修改现有函数或类代码的情况下&#xff0c;为它们添加额外的功能。装饰器本质上是一个接受函数或类作为参数的可调用对象&#xff0c;并返回一个新的函数或类对象…

如何为色盲适配图形用户界面

首发日期 2024-05-25, 以下为原文内容: 答案很简单: 把彩色去掉, 测试. 色盲, 正式名称 色觉异常. 众所周知, 色盲分不清颜色. 如果用户界面设计的不合理, 比如不同项目只使用颜色区分, 而没有形状区分, 那么色盲使用起来就会非常难受, 甚至无法使用. 色盲中最严重的情况称为…

程序员如何高效挖掘市场需求

如何高效发掘市场需求&#xff1f; 那么&#xff0c;我们怎样能够高效地发掘市场的需求呢&#xff1f; 首先&#xff0c;需要指出的是&#xff0c;在挖掘需求时&#xff0c;最好基于个人已有的行业背景或对某个行业的深刻理解来进行。这样做主要有两个原因&#xff1a; 对于…

卡码网用友提前批笔试 | 121 大数减法、122 滑动窗口最大值、117 软件架构

121 大数减法 一开始这么写&#xff0c;但是就是有90%的数据通过不了 #include <iostream> #include <string> using namespace std;void reverse(string& s,int l, int r) {while (l < r) {char c s[l];s[l] s[r];s[r] c;l; r--;} }int main() {strin…

电阻常见失效模式

电阻常见失效模式&#xff1a; 电阻器由于结构较为简单&#xff0c;工艺成熟&#xff0c;通常失效率相对较低。器失效主要表现为以下几种&#xff1a; 阻值漂移&#xff1a;老化后通常发生&#xff1b;&#xff08;通过老化试验进行筛选&#xff0c;规避该问题&#xff09; …

Golang Context详解

文章目录 基本介绍context源码剖析Context接口emptyCtxcancelCtxtimerCtxvalueCtx context使用案例协程取消超时控制数据共享 基本介绍 基本介绍 在Go 1.7版本中引入了上下文&#xff08;context&#xff09;包&#xff0c;用于在并发编程中管理请求范围的数据、控制生命周期、…

首届IEEE RAS峰会,为什么大厂阿里、字节、腾讯都参加了?

"RAS in Data Centers 2024" 首届IEEE RAS&#xff08;Reliability, Availability, and Serviceability&#xff0c;即可靠性、可用性和可维护性&#xff09;在数据中心峰会在2024年6月11日至12日举行&#xff0c;地点设在美国加利福尼亚州圣克拉拉市的圣克拉拉万豪酒…

Python模块导入,别out了,看看这些高级玩法!

目录 1、基础导入&#xff1a;import语句 &#x1f4da; 1.1 直接导入模块 1.2 导入模块别名 1.3 从模块导入特定属性 2、高级导入&#xff1a;from...import &#x1f9f0; 2.1 选择性导入模块成员 2.2 嵌套模块导入 2.3 避免命名冲突策略 3、动态导入&#xff1a;imp…

32位和64位的Windows7均不支持UEFI启动方式?试试看!

前言 今天小白突然想起&#xff1a;自己已经接近8年没有安装过32位的Windows系统了&#xff0c;这8年装的上百台电脑都是用的64位Windows。 今天 闲来无事 嗯……应该算是有小伙伴提出了个问题&#xff1a; 这位小伙伴表示&#xff1a;自己无论安装32位还是64位的Windows7都…

力扣2080.区间内查询数字的频率

力扣2080.区间内查询数字的频率 在下标上做二分 把所有下标存入哈希表在left,right的范围内做二分求个数 class RangeFreqQuery {unordered_map<int, vector<int>> pos;public:RangeFreqQuery(vector<int>& arr) {for(int i0;i<arr.size();i){pos[…

【机器学习系列】深入理解集成学习:从Bagging到Boosting

目录 一、集成方法的一般思想 二、集成方法的基本原理 三、构建集成分类器的方法 常见的有装袋&#xff08;Bagging&#xff09;和提升&#xff08;Boosting&#xff09;两种方法 方法1 &#xff1a;装袋&#xff08;Bagging&#xff09; Bagging原理如下图&#xff1a; …

vscode 访问容器的方式

方法一&#xff1a;先连服务器&#xff0c;再转入容器 配置客户机A M1. 客户机A通过 vscode 连接服务器B&#xff0c;再连接容器C 配置vscode的ssh配置文件&#xff1a;~.ssh\config&#xff08;当需要多个不同的连接时&#xff0c;使用 IdentityFile 指定公钥位置&#xff09;…

[Mdfs] lc3067. 在带权树网络中统计可连接服务器对数目(邻接表+图操作基础+技巧+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;3067. 在带权树网络中统计可连接服务器对数目 2. 题目解析 挺有意思的一道题目&#xff0c;重点是要能够读懂题目&#xff0c;然后结合几个图相关的处理技巧即可拿下。 图存储&#xff1a;邻接表即可。无向无…

浅谈GNU LIBC的版本间的变化

多线程调试的意外发现 昨天笔者在协助朋友调试一个多线程文件传输的应用时&#xff08;传输代码不依赖开源库&#xff09;&#xff0c;发现会多次打开同一个文件。这样产生的一个结果是文件描述符泄露&#xff0c;应用运行一段时间后&#xff0c;就不能再创建新的文件描述符了…