- 博客(26)
- 收藏
- 关注
原创 I/O多路复用服务器——Select
当客户端连接变多时会创建连接相同个数的线程或进程,因此当数值比较大的时候,如果上千个连接,此时线程/进程占用以及CPU在上千个进程/线程之间的调度成本太大,造成性能降低。I/O多路复用就是通过一种机制实现一个进程可以监视多个描述符。相比之下I/O多路复用能够减少系统开销。
2023-10-12 22:26:48
78
原创 TCP多线程服务器--C/C++实现
多线程并发TCP服务器可以同时处理多个客户端请求,并发服务器常见的设计是“一个请求一个线程”:针对每个客户端的请求,主线程都会创建一个工作者线程,由工作者线程来负责和客户端进行通信。多线程服务器是对多进程服务器的改进,由于多进程服务器在创建进程时要消耗较大的系统资源,所以用线程来取代。实例:四条连接在服务端上可以看见相同的ip和不同的端口。服务端代码:threadTcpSer.cpp。客户端代码:tcpClient.cpp。
2023-10-10 21:31:48
568
原创 多进程TCP服务器--C/C++实现
TCP多进程并发服务器的思想是每一个客户端的请求并不直接由服务器直接处理,而是由服务器创建一个子进程来处理。运行结果:服务端可以看见客户端的IP地址相同但端口号不同说明是三条连接。服务端代码:tcpForkServer.cpp。客户端代码:tcpClient.cpp。
2023-10-10 12:54:31
78
原创 TCP循环服务器--C/C++实现
TCP循环服务器一次只能处理一个客户端的请求,只有在这个客户端的所有请求都满足后,服务器才可以继续后面的请求。如果一个客户端占住服务器不放,则其他客户端都不能工作,因此TCP服务器一般很少用循环服务模型。TCP服务器接受一个客户端的连接,然后处理,完成了这个客户端的请求后,断开连接。二、当客户端连接到来时,accept函数返回新的连接套接字。四、在完成与该客户端的交互后关闭连接,返回执行步骤。三、服务器在该套接字上进行数据的接收和发送。客户端代码:tcpClient.cpp。
2023-10-09 20:51:52
216
原创 UDP循环服务器--C/C++实现
UDP循坏服务器实现方法:UDP服务器每次从套接字上读取一个客户端的请求并处理,然后将处理结果返回给客户端。因为UDP是无连接的,没有一个客户端可以一直占用服务器,服务器能满足每一个客户端的请求。服务端代码:udpserver.cpp。客户端代码:udpclient.cpp。
2023-10-09 20:14:33
145
原创 机器人跳跃(今日头条)
如果 H(k+1)>E,那么机器人就失去 H(k+1)−E 的能量值,否则它将得到 E−H(k+1) 的能量值。假设机器人在第 k 个建筑,且它现在的能量值是 EE,下一步它将跳到第 k+1 个建筑。编号为 0 的建筑高度为 0 个单位,编号为 ii 的建筑高度为 H(i) 个单位。第二行是 N 个空格分隔的整数,H(1),H(2),…游戏目标是到达第 N 个建筑,在这个过程中能量值不能为负数个单位。输出一个整数,表示所需的最少单位的初始能量值上取整后的结果。起初,机器人在编号为 0 的建筑处。
2022-09-20 16:52:54
114
1
原创 分巧克力(二分法)
例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。例如一块 6×5的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。小明一共有 N 块巧克力,其中第 i块是Hi×Wi 的方格组成的长方形。小明一共有 N 块巧克力,其中第 i块是Hi×Wi 的方格组成的长方形。
2022-09-20 16:48:02
250
原创 3、防御迷阵(二分+bfs)
而第1行的m个房间有m扇向外打开的门,是迷阵的入口。除了第1行和第n行的房间外,每个房间都安装了激光杀伤装置,将会对进入房间的人造成一定的伤害。第i行第j列造成的伤害值为a[i,j]。现在士兵打算以最小伤害代价通过迷阵,显然,他们可以选择任意多的人从任意的门进入,但必须到达第n行的房间。一个士兵受到的伤害值为他在经过的路径上所有房间的伤害值中的最大值。现在,士兵们掌握了迷阵的情况,他们需要提前知道怎么安排士兵的行进路线可以使得伤害值最小。接下来n行,每行m个数,第i行第j列的数表示a[i,j]。......
2022-08-06 17:14:08
959
原创 最满意的方案
高考结束了,同学们要开始了紧张的填写志愿的过程,大家希望找一个自己最满意的大学填报方案,请你编程帮忙实现。现有m(m≤100000)所学校,每所学校预计分数线是ai(ai≤106)。有n(n≤100000)位学生,估分分别为bi(bi≤106)。根据n位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。m表示学校数,n表示学生数。第二行共有m个数,表示m个学校的预计录取分数。第三行有n个数,表示n个学生的估分成绩。...
2022-07-16 15:22:25
1080
原创 2 迷宫出口
题目描述一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,0和1,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为1),则看成无法办到。输入第1行是一个正整数n (1 ≤ n ≤ 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中
2022-07-10 11:09:47
632
原创 1、01 扫地机器人(基础)
Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点(1,1)点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向下,向下不能走则尝试向左,向左不能走则尝试向上;直到所有的点都扫过。Mike为了验证自己设计的算法是否正确,打算先模拟一下这个算法,每当机器人走过一个单元格时,会在单元格内标记一个数字,这个数字从1开始,每经过一个单元格数字会递增1,直到所有的单元格都扫一遍,
2022-07-10 11:06:41
1222
原创 10、除法(枚举)
题目描述:输入一个正整数n,按从小到大的顺序输出abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79例样输入:62例样输出79546/01283=6294736/01528=62#include <iostream>#include<algorithm>#include<iomanip>int n;int a[10];int main(){ for (int i = 0; i &l
2022-04-05 12:00:13
73
原创 9、最大乘积
题目描述输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出-1(表示无解)。1<=n<=18,-10<=Si<=10.样例输入:32 4 -352 5 -1 2 -1样例输出:820分析:连续子序列有两个要素:一个起点一个终点,因此只要枚举起点和终点即Si的绝对值不超过10,一共不超过18个元素所以最大值不超过1e18,可以用long long存#include<iostream>
2022-04-04 23:27:08
357
原创 8、数字三角形(线性Dp)
问题描述在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0–99。输入格式:第一行为一个整数n,表示接下来将要输入的三角形行数接下来是n行,每行输入当前行数的个数个数输出格式:输出一个数字,表示最大和样例输入:5样例输出:30#include <iostream>#include&l..
2022-04-03 20:24:48
397
原创 4、判断素数
素数:质数又称素数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;下面是代码:#include <stdio.h>int main() { int n; printf("请输入一个1-100之间的整数:\n"); scanf("%d", &n); int m = 0; for (int i = 2; i < n; i++ ) { if(n % i == 0) { m++; } } if (m == 0) {
2022-03-30 19:43:56
278
原创 3、求1~n的和
while 循环法:#include<iostream>using namespace std ;int main(){ int n;long long ans=0; cin>>n;while(n){ans+=n;n--;}cout<<ans<<endl;return 0;}do while循环:#include<iostream>using namespace std ;int main(){
2022-03-30 18:41:02
258
原创 2、判断是否为闰年
首先要知道什么样的年份成为闰年一:1、普通闰年 :能被4整除同时不能被100整除2、世纪闰年:能被400整除下面就是判断年份是否为闰年的代码#include <iostream>using namespace std;int main(){ int n; cin >> n; if (n % 4 == 0 && n % 100 != 0) cout << n <<"年是闰年" << endl;
2022-03-30 15:38:42
147
原创 1、Fibonacci数列
Fibonacci数列有下面特点F1=1; (n=1)F2=1; (n=2)Fn=Fn-1+Fn-2; (n>=3)现要求打印Fibonacci数列的前40项一行4个数#include <iostream>#include <iomanip>//格式控制头文件using namespace std;int main(){ long long f1, f2; int i; f1 = f2 = 1; for (int i = 1; i <
2022-03-30 15:21:16
580
原创 7、每日一题—货仓选址(贪心)
在一条数轴上有 N家商店,它们的坐标分别为 A1∼AN。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。输入格式第一行输入整数 N。第二行 N个整数 A1∼AN。输出格式输出一个整数,表示距离之和的最小值。数据范围1≤N≤1000000≤Ai≤40000输入样例:46 2 9 1输出样例:12//根据例子模拟可以知道,当选址在区间中央时总距离..
2022-03-28 19:39:20
387
转载 6、c/c++每日一题—数的范围(蓝桥杯)
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。输入格式第一行包含整数 n 和 q,表示数组长度和询问个数。第二行包含 n 个整数(均在 1∼100001∼10000 范围内),表示完整数组。接下来 q 行,每行包含一个整数 k,表示一个询问元素。输出格式共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该
2022-03-27 06:45:00
210
原创 5、c/c++每日一题—翻硬币(蓝桥杯)
问题描述小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:输入格式两行等长的字符串,分别表示初始状态和要达到的目标状态。每
2022-03-26 14:19:43
586
原创 4、C/C++每日一题—递归实现排列型枚举
把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数 n。输出格式按照从小到大的顺序输出所有方案,每行 11 个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1C++ 代码:#include<iostream>using name
2022-03-26 12:08:17
1019
原创 3、C/C++每日一题—统计单词的个数
问题:输入一行字符,统计单词的个数,单词之间以空格隔开;//统计单词个数#include <iostream>#include <string>using namespace std;int countword(string s){ int len, i = 0, num = 0; len = s.length();//字符串长度 while (i < len) { while (s[i] == ' ')//跳过多个空格 i++; if (
2022-03-26 06:45:00
3436
原创 2、C/C++每日一题——蛇形填数
蛇形填数问题:输入一个整数n,按照蛇形填写n*n的矩阵#include <iostream>#include <iomanip>#include <cstring>using namespace std;int main2(){ int n, x, y, total; cin >> n; int** a = new int* [n];//定义动态二维数组 for (int i = 0; i < n; i++) { a[i]
2022-03-25 09:36:49
1111
原创 1、c/c++每日一题—开关灯
题目:现在有n盏灯,编号为1~n,开始时所有的灯都是关的,编号为1的人走过来,把编号是1的倍数的灯开关按下(开的关上,关的打开),编号为2的人把编号是2的倍数的灯开关按下直到第k个人为止。给定n,k(n>0,k<1000),输出哪几盏灯是开着的。题解:我们在这里用一个数组来保存灯是开还是关(0代表关,1代表开)...
2022-03-24 21:28:23
4600
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人