第十二次CCF计算机软件能力认证
第一题:最小差值
给定 n 个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入格式
输入第一行包含一个整数 n。
第二行包含 n 个正整数,相邻整数之间使用一个空格分隔。
输出格式
输出一个整数,表示答案。
数据范围
对于所有评测用例,2≤n≤1000,每个给定的整数都是不超过 10000 的正整数。
输入样例1:
5 1 5 4 8 20输出样例1:
1样例1解释
相差最小的两个数是 5 和 4,它们之间的差值是 1。
输入样例2:
5 9 3 6 1 3输出样例2:
0样例2解释
有两个相同的数 3,它们之间的差值是 0。
解题思路:
双重循环寻找即可
#include<iostream>using namespace std;const int N = 1010;
int n;
int a[N];int main()
{cin >> n;for(int i = 0;i < n;i ++)cin >> a[i];int res = 0x3f3f3f3f;for(int i = 0;i < n;i ++)for(int j = i + 1;j < n;j ++)res = min(res , abs(a[i] - a[j]));cout << res << endl;return 0;
}
第二题:游戏
有 n 个小朋友围成一圈玩游戏,小朋友从 1 至 n 编号,2 号小朋友坐在 1 号小朋友的顺时针方向,3 号小朋友坐在 2 号小朋友的顺时针方向,……,1 号小朋友坐在 n 号小朋友的顺时针方向。
游戏开始,从 1 号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加 1。
若一个小朋友报的数为 k 的倍数或其末位数(即数的个位)为 k,则该小朋友被淘汰出局,不再参加以后的报数。
当游戏中只剩下一个小朋友时,该小朋友获胜。
例如,当 n=5,k=2 时:
- 1 号小朋友报数 1;
- 2 号小朋友报数 2 淘汰;
- 3 号小朋友报数 3;
- 4 号小朋友报数 4 淘汰;
- 5 号小朋友报数 5;
- 1 号小朋友报数 6 淘汰;
- 3 号小朋友报数 7;
- 5 号小朋友报数 8 淘汰;
- 3 号小朋友获胜。
- n 和 k,请问最后获胜的小朋友编号为多少?
输入格式
输入一行,包括两个整数 n 和 k,意义如题目所述。
输出格式
输出一行,包含一个整数,表示获胜的小朋友编号。
数据范围
对于所有评测用例,1≤n≤1000,1≤k≤9。
输入样例1:
5 2输出样例1:
3输入样例2:
7 3输出样例2:
4
解题思路:
像是约瑟夫环,但是对于简单题直接模拟就行
#include<iostream>
#include<cstring>using namespace std;const int N = 1010;
int n , k;
bool st[N];int main()
{cin >> n >> k;memset(st , 0 , sizeof st);int now = 1;int cnt = 0 , last = n;while(last != 1){if(now == n + 1) now = 1;if(!st[now]){cnt ++;if(cnt % k == 0 || cnt % 10 == k) {st[now] = true;last --;}}now ++;}for(int i = 1;i <= n;i ++)if(!st[i]) cout << i << endl;return 0;
}
第三题:Crontab
超级大模拟
// 总体思路:遍历每一个时间点;对每一个时间点遍历所有可能执行的命令
// Task List
// 1. 时间的存储// 1.1 能够实现next: next()// 1.2 能够打印: to_string()
// 2. 任务的存储// 2.1 所有可行时间: bool 数组 + check()// 2.2 可读取特定格式的输入: work()# include <iostream>
# include <unordered_map>
using namespace std;int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};struct Timer {int year, month, day, week, hour, minute;// 读入(初始化)Timer(string str) {sscanf(str.c_str(), "%04d%02d%02d%02d%02d", &year, &month, &day, &hour, &minute);}// 格式化打印string to_string() {char str[20];sprintf(str, "%04d%02d%02d%02d%02d", year, month, day, hour, minute);return str;}bool operator< (const Timer& t) const {if (year != t.year) return year < t.year;if (month != t.month) return month < t.month;if (day != t.day) return day < t.day;if (hour != t.hour) return hour < t.hour;return minute < t.minute;}int is_leap() {if (year % 400 == 0 || year % 100 != 0 && year % 4 == 0) return 1;return 0;}int get_day() {if (month == 2) return months[month] + is_leap();return months[month];}// nextvoid next() {if ( ++ minute == 60) {minute = 0;if ( ++ hour == 24) {hour = 0;week = (week + 1) % 7;if ( ++ day > get_day()) {day = 1;if ( ++ month == 13) {month = 1;year ++;}}}}}};struct Task {bool minutes[60], hours[24], day_of_month[32], month[13], day_of_week[7];string name;bool check(Timer& t) {return minutes[t.minute] && hours[t.hour] && day_of_month[t.day] &&month[t.month] && day_of_week[t.week];}
}task[20];unordered_map<string, int> nums;
void init() {string keys[] = {"jan", "feb", "mar", "apr", "may", "jun","jul", "aug", "sep", "oct", "nov", "dec","sun", "mon", "tue", "wed", "thu", "fri","sat"};int values[] = {1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12,0, 1, 2, 3, 4, 5,6};for (int i = 0; i < 19; i ++ )nums[keys[i]] = values[i];
}int get(string str) {if (str[0] >= '0' && str[0] <= '9') return stoi(str);string s;for (auto c: str) s += tolower(c);return nums[s];
}void work(string str, bool st[], int len) {if (str.find('*') != -1) {for (int i = 0; i < len; i ++ ) st[i] = true;}else {// 双指针,以','为分界单独处理每一部分for (int i = 0; i < str.size(); i ++ ) {if (str[i] == ',') continue;int j = i + 1;while (j < str.size() && str[j] != ',') j ++;string s = str.substr(i, j - i);i = j; // 不知道为什么不能写成i = j + 1// 处理单独部分int k = s.find('-');if (k != -1) {int l = get(s.substr(0, k)), r = get(s.substr(k + 1));for (int u = l; u <= r; u ++ ) st[u] = true;}else st[get(s)] = true;}}
}int main() {init();int n;string start, end;cin >> n >> start >> end;for (int i = 0; i < n; i ++ ) {string minutes, hours, day_of_month, month, day_of_week, name;cin >> minutes >> hours >> day_of_month >> month >> day_of_week >> name;work(minutes, task[i].minutes, 60);work(hours, task[i].hours, 24);work(day_of_month, task[i].day_of_month, 32);work(month, task[i].month, 13);work(day_of_week, task[i].day_of_week, 7);task[i].name = name;}Timer t("197001010000"), S(start), E(end);t.week = 4;while (t < E) {if (!(t < S)) {for (int i = 0; i < n; i ++ ) if (task[i].check(t))cout << t.to_string() << ' ' << task[i].name << endl;}t.next();}return 0;
}
第四题:行车路线
小明和小芳出去乡村玩,小明负责开车,小芳来导航。
小芳将可能的道路分为大道和小道。
大道比较好走,每走 1 公里小明会增加 1 的疲劳度。
小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走 s 公里小明会增加 s2 的疲劳度。
例如:有 5 个路口,1 号路口到 2 号路口为小道,2 号路口到 3 号路口为小道,3 号路口到 4 号路口为大道,4 号路口到 5 号路口为小道,相邻路口之间的距离都是 2 公里。
如果小明从 1 号路口到 5 号路口,则总疲劳值为 (2+2)^2+2+2^2=16+2+4=22。
现在小芳拿到了地图,请帮助她规划一个开车的路线,使得按这个路线开车小明的疲劳度最小。
输入格式
输入的第一行包含两个整数 n,m,分别表示路口的数量和道路的数量。路口由 1 至 n 编号,小明需要开车从 1 号路口到 n 号路口。
接下来 m 行描述道路,每行包含四个整数 t,a,b,c,表示一条类型为 t,连接 a 与 b 两个路口,长度为 c 公里的双向道路。其中 t 为 00 表示大道,t 为 11 表示小道。
保证 1 号路口和 n 号路口是连通的。
输出格式
输出一个整数,表示最优路线下小明的疲劳度。
数据范围
对于 30% 的评测用例,1≤n≤8,1≤m≤10;
对于另外 20% 的评测用例,不存在小道;
对于另外 20% 的评测用例,所有的小道不相交;
对于所有评测用例,1≤n≤500,1≤m≤105,1≤a,b≤n,t 是 0 或 1,c≤1e5。
保证答案不超过 1e6。输入样例:
6 7 1 1 2 3 1 2 3 2 0 1 3 30 0 3 4 20 0 4 5 30 1 3 5 6 1 5 6 1输出样例:
76样例解释
从 1 走小道到 2,再走小道到 3,疲劳度为 5^2=25;然后从 3 走大道经过 4 到达 5,疲劳度为 20+30=50;最后从 5 走小道到 6,疲劳度为 1。
总共为 76。
解题思路:
题目给定所有答案不超过1e6,其实也就保证了连续小路的长度不超过1000(1000的平方就是1e6)
若要更新k点
大路:dist[k][0] = dist[i][j] + w
小路:dist[k][j + w] = dist[i][j] - j ^ 2 + (j + w) ^ 2 考虑连续小路的平方
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>using namespace std;const int N = 5e5 + 10 , M = 510 , INF = 0x3f3f3f3f3f;
int n , m;
int h[N] , ne[N] , w[N] , e[N] , idx = 0;
int f[N]; // 大路和小路
int dist[M][1010]; // 从1到点i的最短距离,第二维j表示1到i点这条路径上最后那段(连接i)的小路的长度
bool st[M][1010];struct node
{int x , y , v;bool operator < (const node&t) const{return v > t.v;}
};void add(int t , int a , int b , int c)
{e[idx] = b , f[idx] = t , w[idx] = c , ne[idx] = h[a] , h[a] = idx ++;
}void dij()
{memset(st , 0 , sizeof st);memset(dist , 0x3f , sizeof dist);priority_queue<node>q;q.push({1 , 0 , 0});dist[1][0] = 0;while(!q.empty()){auto t = q.top();q.pop();if(st[t.x][t.y]) continue;st[t.x][t.y] = true;for(int i = h[t.x];~i;i = ne[i]){int j = e[i] , y = t.y;if(f[i]) // 小路{y += w[i];// 小路更新if(y <= 1000){if(dist[j][y] > t.v - t.y * t.y + y * y){dist[j][y] = t.v - t.y * t.y + y * y;if(dist[j][y] <= INF) q.push({j , y , dist[j][y]});}}}else{if(dist[j][0] > t.v + w[i]){dist[j][0] = t.v + w[i];if(dist[j][0] <= INF) q.push({j , 0 , dist[j][0]});}}}}
}int main()
{memset(h , -1 , sizeof h);cin >> n >> m;while(m --){int t , a , b , c;cin >> t >> a >> b >> c;add(t , a , b , c) , add(t , b , a , c);}dij();int res = INF;for(int i = 0;i <= 1000;i ++) res = min(res , dist[n][i]);cout << res << endl;return 0;
}
第五题:商路
dp+图论+线段树+dfs
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod = 1e18;
const int N = 1e5 + 5;struct Edge
{int t, s, ne;
} e[N];
int h[N], idx1;
void add(int u, int v, int s) { e[++idx1] = {v, s, h[u]}, h[u] = idx1; }ll v[N], f[N];
ll d[N], dp[N];
int sz[N], ind[N], idx2;
void dfs1(int from, ll s)
{// 第一趟 dfs,求出 dfs 序、到根节点的距离、子树大小ind[from] = ++idx2, d[idx2] = s, sz[from] = 1;for (int i = h[from]; i; i = e[i].ne)dfs1(e[i].t, s + e[i].s), sz[from] += sz[e[i].t];
}#define sq(x) ((x) * (x)) // 求平方 square,记得 x 要加括号:(x)
#define ff(x) (dp[x] - sq(d[x])) // 凸包点的纵坐标值
#define dy(x1, x2) (ff(x1) - ff(x2)) // dy/dx 即斜率
#define dx(x1, x2) (d[x1] - d[x2]) // 凸包点的横坐标 d[x],用不上就不单独定义了
struct Node
{bool vis;vector<int> q; // 维护的凸包void build(){ // 构造凸包,就地算法,一趟遍历即可int r = 0;for (int &i : q){while (r > 1 &&(double)dy(q[r - 1], q[r - 2]) * dx(i, q[r - 1]) <=(double)dy(i, q[r - 1]) * dx(q[r - 1], q[r - 2]))r--;q[r++] = i;}q.resize(r);}ll find(int i){ // 二分搜索,传入的 i 是原序号,ind[i] 为 dfs 序if (!vis)vis = 1, build();ll k = -2 * (f[i] + d[ind[i]]); // 斜率,记得取负int l = -1, r = q.size() - 1; // 如果只有一个点,直接取 r 即可while (r - l > 1){ // 至少有两个点的时候,二分搜索int mid = l + r >> 1;if ((double)dy(q[mid + 1], q[mid]) <=(double)k * dx(q[mid + 1], q[mid]))r = mid; // r 一定是可取的elsel = mid; // l 一定是不取的}return dp[q[r]] + v[i] - sq(f[i] + d[ind[i]] - d[q[r]]);}
} tr[N << 2];#define cur tr[x] // 当前节点
#define lch tr[x << 1] // 左孩子节点
#define rch tr[x << 1 | 1] // 右孩子节点
#define mid (l + r >> 1)
void merge(int x)
{ // 归并排序的 merge 算法cur.q.resize(lch.q.size() + rch.q.size());int i = 0, j = 0, k = 0;while (i < lch.q.size() || j < rch.q.size())if (i == lch.q.size())cur.q[k++] = rch.q[j++];else if (j == rch.q.size())cur.q[k++] = lch.q[i++];else if (d[lch.q[i]] <= d[rch.q[j]])cur.q[k++] = lch.q[i++];elsecur.q[k++] = rch.q[j++];
}
void build(int x, int l, int r)
{ // 构造线段树cur.vis = 0;if (l == r)cur.q.resize(1, l);elsebuild(x << 1, l, mid), build(x << 1 | 1, mid + 1, r), merge(x);
}int L, R, n, T; // [L, R] 为查询的区间
ll query(int x, int l, int r, int i)
{ // [l, r] 为当前节点维护的区间if (l >= L && r <= R)return cur.find(i);elsereturn max(mid >= L ? query(x << 1, l, mid, i) : 0,mid < R ? query(x << 1 | 1, mid + 1, r, i) : 0);
}
void dfs2(int from)
{if (!h[from])return;// 加引用,h 数组用完即弃for (int &i = h[from]; i; i = e[i].ne)dfs2(e[i].t);// from 为原标号,ind[from] 为 dfs 序L = ind[from] + 1, R = ind[from] + sz[from] - 1;dp[ind[from]] = query(1, 1, n, from);
}
int main()
{scanf("%d", &T);while (T--){idx1 = idx2 = 0;scanf("%d", &n);for (int i = 1, u, s; i <= n; i++)scanf("%d%d%lld%lld", &u, &s, v + i, f + i), add(u, i, s);dfs1(1, 0), build(1, 1, n), dfs2(1);ll ans = 0; // 斜率优化不能对 dp 值取模,否则维护不了凸包for (int i = 1; i <= n; i++)ans = (ans + dp[i]) % mod, dp[i] = 0;printf("%lld\n", ans);}
}
相关文章:
第十二次CCF计算机软件能力认证
第一题:最小差值 给定 n 个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。 输入格式 输入第一行包含一个整数 n。 第二行包含 n 个正整数,相邻整数之间使用一个空格分隔。 输出格式 …...
ceph pg inconsistent修复(unexpected clone)
问题概述: ceph -s 显示pg 10.17 inconsistent 且命令ceph pg repair 10.17无法修复,/var/log/ceph/cep-osd.3.log报错内容如下: pg 10.17 osd [3,4] 权威副本osd:3 repair 10.17 10:e889b16a:::rbd_data.88033092ad95.00000000…...
供求重构是产业互联网的核心 个体崛起是产业互联网的终点
文章开头提到的网约车市场缘何会出现这样的困境?其中一个很重要的原因在于,建构于互联网模式之下的供求关系业已走到了尽头,仅仅只是依靠撮合和中介,仅仅只是凭借平台和中心开始无法破解供求两端的矛盾和问题。如何解决这一问题&a…...
torchvision.datasets数据加载失败
torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败,可以使用手动下载数据 Ctrl点击可以进入相关包文件,查找下载地址:https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…...
【UEC++学习】UE网络 - Replication、RPC
1. UE网络架构 (1)UE的网络架构是SC(Server - Client)的模式,这种模式的优势:这种模式让所有客户端都在服务器端进行安全验证,这样可以有效的防止客户端上的作弊问题。 (2ÿ…...
C语言案例 按序输出三个整数-02
题目:输入三个整数a,b,c,按从小到大的顺序输出 步骤一:定义程序的目标 编写一个C程序,随机输入三个整数,按照从小到大的顺序输出。 步骤二:程序设计 整个程序由三个模块组成,第一个为scanf输入函数模块&a…...
区块链实验室(16) - FISCO BCOS实验环境
经过多次重复,建立一个FISCO BCOS实验环境。该环境是一个VMWare虚拟机,能够启动FISCO BCOS自创建的4节点区块链,不必下载依赖包即可编译Fisco Bcos目标文件,安装有VsCode1.81版本。 启动4节点的Fisco Bcos区块链 启动控制台 编译…...
Java事件监听机制
这里写目录标题 先进行专栏介绍再插一句 开始喽事件监听机制分析观察者模式观察者模式由以下几个角色组成:观察者模式的工作流程如下:观察者模式的优点包括:观察者模式适用于以下场景:总结 事件监听机制的工作流程如下:…...
记一次ubuntu16误删libc.so.6操作的恢复过程
背景 操作系统:ubuntu16 glibc版本:2.23 修改原因: 经过一系列报错和手工构建之后,vulkansdk成功安装(起码运行./vulkansdu成功),在进行./vulkaninfo进行验证时,报错:…...
MAVLINK—C语言demoWindows版本
mavlink/examples/c/udp_example.c 在学习mavlink时准备学习一下官网的C语言example,发现是unix系统的,打算在Windows系统下尝试,于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…...
区块链实验室(15) - 编译FISCO BCOS的过程监测
首次编译开源项目,一般需要下载很多依赖包,尤其是从github、sourceforge等下载依赖包时,速度很慢,编译进度似乎没有一点反应,似乎陷入死循环,似乎陷入一个没有结果的等待。本文提供一种监测方法,…...
java_IO其它架包使用
文章目录 apache-common包的使用 apache-common包的使用 IO技术开发中,代码量很大,而且代码的重复率较高,为此Apache软件基金会,开发了IO技术的工具类commonsIO,大大简化了IO开发。 Apahce软件基金会属于第三方&…...
一、7.协同式任务切换与抢占式任务切换
使用TSS来在任务切换时保护现场和恢复现场 内核任务:单纯由内核组成的任务,和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...
JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已…...
yay无法更新问题解决
背景 更新yay后,yay安装软件捞出问题,查的github上的都不靠谱。因此需要把yay的版本固定下,正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...
C语言 — 动态内存管理(动态内存函数)
前言 本期分为三篇介绍动态内存管理相关内容,关注博主了解更多 博主博客链接:https://blog.csdn.net/m0_74014525 本期介绍动态内存函数,函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇ÿ…...
Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合
推荐:使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT? Visual ChatGPT 是一个包含 Visual Foundation 模型 (VFM) 的系统,可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...
基于java理发店预约系统微信小程序设计与实现
摘要 多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面,信息技术至始至终都是成就行业发展的重要秘密。不论何种行业,大到国家、企业,小到团体、个人都在多方位的结合信息化技术…...
【软件测试】大厂测工都是这样学习的,你get到了吗?
有不少的软件测试工程师站在“十字路口”迷茫、无助,找不到自己的方向。一切的迷茫都是因为想得太多而做的太少!每位软件测试行业从业者都能意识到目前自己面临的窘境,但能及时作出改变,顺应时代变化的人还是太少。多数人明明“泰…...
如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克
如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文,也写过很多关于ffmpeg使用的图文,那么这次继续,把这两个开源软件放在一起,能碰撞出什么火花般的功能来。 这就是给视频文…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
