2022 icpc南京(I,G,A,D,M,B)

文章目录

  • [I. Perfect Palindrome](https://codeforces.com/gym/104128/problem/I)
  • [G. Inscryption](https://codeforces.com/gym/104128/problem/G)
  • [A.Stop, Yesterday Please No More](https://codeforces.com/gym/104128/problem/A)
  • [D. Chat Program](https://codeforces.com/gym/104128/problem/D)
  • [M. Drain the Water Tank](https://codeforces.com/gym/104128/problem/M)
  • [B. Ropeway](https://codeforces.com/gym/104128/problem/B)

I. Perfect Palindrome

题意:

给定长度为n的字符串,令f(S,d)表示将S左移d次后获 得的字符串。若对于所有非负整数d,f(S,d)都是回文串, 则称S为完美回文。 每次操作可以修改一个字母,求将A变为完美回文的最少操作次数

完美回文串必须所有字符均相等
所以枚举将整个字符串全变成a,全变成b,全变成c...,答案取最优即可
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
string s;
void solve() {
	cin>>s;
	map<char,int>mp;
	for(int i=0;i<(int)s.size();i++) mp[s[i]]++;
	int ans=2e9;
	for(char ch='a';ch<='z';ch++){
		ans=min(ans,(int)s.size()-mp[ch]);
	}
	cout<<ans<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

G. Inscryption

题意:

维护一个序列,序列里一开始只有一个1。您要处理n个事 件,每次要么往序列里添加一个1,要么从序列里拿出两个 数,加起来再放回去,要么在这两种事件中选一个。 在每次都能从序列里拿出两个数的前提下,求序列平均值的 最大值

首先我们分别分析一下两种操作
先整体感受一下
1.往序列里添加一个1,那么平均数变为(sum+1)/(cnt+1),平均数会趋向1,如果操作前平均数小于1,那么操作后平均数变大;如果操作前平均数大于1,那么操作后平均数变小;如果操作前平均数等于1,那么操作后平均数不变
2.将序列的两个数相加,替换成一个数,那么平均数就是sum/(cnt-1),平均数一定是变大的
这样整体感受一下,猜测2是更优的,但是当平均数小于1时,其实并不知道哪个操作平均数增加的更多
总归还是得用数学公式严格推导:
假设(sum+1)/(cnt+1)>sum/(cnt-1)
==>(sum+1)*(cnt-1)>sum*(cnt+1)
==>sum<cnt/2-1/2
也就是说只有当sum<cnt/2-1/2时,做操作1后的平均数比做操作2后的平均数大
但是sum肯定是大于等于cnt的,因为每个数都大于等于1,所以sum不可能小于cnt/2-1/2,故操作2肯定更优

故我们的贪心策略就是如果它确定选择某个操作,那么没办法只能做,如果自己选择的话,肯定优先选择操作2,但是做操作2有一个限制,就是个数必须大于等于2,所以我们在贪心的过程中,如果选择操作2的时候个数小于2,那么就反悔,记录前面让我们自己选择时我们选择了2的个数,然后将2改为1,直到个数大于等于2,如果反悔都不能让个数大于等于2,那么无解,输出-1
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N = 1e6 + 10;
int a[N];
int n;
int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int tot = 0; //自己选择时选择了2的个数
	int sum = 1, cnt = 1;//注意,初始时就有1个数
	for (int i = 1; i <= n; i++) {
		if (a[i] == 1) sum++, cnt++;
		else if (a[i] == -1) {
			if (cnt >= 2) cnt--;
			else {
				while (cnt < 2 && tot > 0) {
					tot--;
					sum++;
					cnt += 2; //将操作2变为操作1,相当于多了两个数
				}
				if (cnt < 2) {
					cout << -1 << endl;
					return;
				}
				cnt--;
			}
		} else {
			if (cnt >= 2) { //选择2
				cnt--;
				tot++;
			} else { //选择1
				sum++;
				cnt++;
			}
		}
	}
	int d=gcd(sum,cnt);
	sum/=d;
	cnt/=d;
	cout << sum << ' ' << cnt << endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

A.Stop, Yesterday Please No More

题意:

给定一张n行m列的网格,在位于第i行第j列的格子 上有一个洞,其它每个格子都是空地并且都有一只袋鼠。 所有袋鼠会同时根据按下的U,D,L,R按键移动,如果一 只袋鼠踩到了洞或者移动到了网格外面,它将被从网格上移 除。 给出长度为l的一个操作序列,若执行后网格上恰有k只袋 鼠存留,求出有多少位置可能存在洞

首先我们先考虑出界的情况,我们只要按照操作顺序操作,看有哪些行,哪些列会跑到0行,n+1行,0列,m+1列,那么这些行和列均会出界
就是我们分别记录操作的前缀U,D方向和前缀L,R方向的最终结果,比如说枚举到某个操作,前缀U,R为3,说明向上移动了3行,那么第3行的就移动到了第0行,那么第3行的就会全部出界
(当然,有一个trcik,运动是相对的,我们可以考虑让边界反向移动,边界外的就是出界的)
总之,我们会发现没有出界的是一个矩形,它太规则了,规则到我们可以把它看作一个整体,同时对它们进行操作,所以就按照操作顺序走一遍,由于只有一个洞,假设洞为(x,y),那么就看几只袋鼠会经过(x,y)那么就有几只袋鼠会掉入洞中,所以我们就把矩形经过的地方均+1,那么对于某个洞,加了多少次,就有几只袋鼠经过,但是如果某一只袋鼠经过了某个点,加了一次,它又走回来,那是不能再加一次的,所以需要判重,就是某个矩形位置已经走过了,那这个矩形位置就不再加1了(矩阵大小是固定的,看作一个整体,用左上角坐标代表整个矩阵),很显然用二维差分进行矩形整体加1,再用二维前缀和还原每个点加了多少
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
typedef pair<int,int>PII;
const int N=1e3+20;
int a[N][N];
int n,m,k;
string s;
void insert(int x1,int y1,int x2,int y2,int c){
	a[x1][y1]+=c;
	a[x1][y2+1]-=c;
	a[x2+1][y1]-=c;
	a[x2+1][y2+1]+=c;
}
void solve() {
	cin>>n>>m>>k;
	cin>>s;
	for(int i=0;i<=n+10;i++){
		for(int j=0;j<=m+10;j++){
			a[i][j]=0;
		}
	}
	int L=1,R=m;
	int U=1,D=n;
	int u=1,d=n,l=1,r=m;
	for(int i=0;i<(int)s.size();i++){
		if(s[i]=='U') u++,d++;
		else if(s[i]=='D') u--,d--;
		else if(s[i]=='L') l++,r++;
		else l--,r--;
		U=max(U,u),D=min(D,d),L=max(L,l),R=min(R,r);
	}
	if(U>D||L>R){
		if(k==0) cout<<n*m<<endl;
		else cout<<0<<endl;
		return;
	}
	if((D-U+1)*(R-L+1)<k){
		cout<<0<<endl;
		return;
	}
	map<PII,bool>mp;
	insert(U,L,D,R,1);
	mp[{U,L}]=true;
	for(int i=0;i<(int)s.size();i++){
		if(s[i]=='U') U--,D--;
		else if(s[i]=='D') U++,D++;
		else if(s[i]=='L') L--,R--;
		else L++,R++;
		if(!mp.count({U,L})) mp[{U,L}]=true,insert(U,L,D,R,1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
		}
	}
	int ans=0;
	int res=(D-U+1)*(R-L+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(res-a[i][j]==k) ans++;
		}
	}
	cout<<ans<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

D. Chat Program

题意:

给定一个长度为n的整数序列a1,a2,··· ,an,同时给定另外 四个整数k,m,c与d,可以进行以下操作至多一次:选择 一个长度恰为m的连续子数组,并将一个长度为m,首项 为c,公差为d的等差序列加到该连续子数组上。 最大化序列中第k大的值

求什么的最大值,想到二分
求最大的第k大的值,那么check某个数x时,只需要保证第k大的数大于等于x就返回true,因为我们要的是最大的第k大的数,那么第k大的数大于等于x就继续往大了找,最终找到的就是第k大的数刚好等于x,此时x是最大的
如何判断第k大的数大于等于x呢?只要大于等于x的数的个数大于等于k
那么如果数本来就大于等于x,那么不需要操作,肯定大于等于x了,那么对于某个区间操作之后,我们要知道有多少数从小于x变成大于等于x了,而且我们要知道每个区间操作之后,分别有多少数从小于x变成大于等于x了

有这样一个trick:区间长度固定为m,那么就将整个区间看作一个整体,用左端点来代表整个区间,之前在cf见过Codeforces Round 974 (Div. 3) D. Robert Hood and Mrs Hood-CSDN博客

还有一个trick:对于一个区间操作,我们想知道有多少数从小于x变成大于等于x了 ,我们只需要按顺序将整个区间操作一遍,然后求出有几个就行了,然后每个区间的话,就是分别对每个区间操作一遍,但是这样会超时

我们反过来,上面是对每一个区间,这里我们就对每一个数,看有哪些区间(左端点代表一个区间)可以让该数从小于x变成大于等于x,将这些区间(左端点代表一个区间 )加1,这样就统计出对每个区间操作有几个数从小于x变成大于等于x了

由于对于一个数来说,合法的区间肯定是连续的,显然差分

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int n,k,m,c,d;
int a[N];
int b[N];
bool check(int x){
	int sum=0;
	for(int i=1;i<=n;i++) sum+=(a[i]>=x);
	for(int i=1;i<=n+1;i++) b[i]=0;
	for(int i=1;i<=n;i++){
		if(a[i]<x){
			int l=0,r=1e9;
			while(l<r){
				int mid=l+r>>1;
				if(a[i]+c+mid*d>=x) r=mid;
				else l=mid+1;
			}
			int pos=i-l;
			if(i-pos+1>m||pos<1) continue;
			int L=max(1ll,i-m+1),R=pos;
			b[L]++,b[R+1]--;
		}
	}
	for(int i=1;i<=n;i++) b[i]+=b[i-1];
	for(int i=1;i<=n;i++){
		if(sum+b[i]>=k) return true;
	}
	return false;
}
void solve() {
	cin>>n>>k>>m>>c>>d;
	for(int i=1;i<=n;i++) cin>>a[i];
	int l=0,r=1e18;
	while(l<r){
		int mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
//    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

M. Drain the Water Tank

题意:

给定一个由n个顶点组成的多边形水箱,里面充满水。 求至少需要安装多少个出水阀门,才能在所有阀门同时打开 后,让水箱里的水全部流出

每个局部最低点都要安装一个出水阀门,因此本题求的就是局部最低点的数量。局部最低点可以按是否位于水平的平台上分成两种情况:在平台上和不在平台上

在这里插入图片描述

点是逆时针顺序给的
两种情况:
1.V字形,必须是先往右下再往左上的那种,贡献加1,这种情况叉积>0
2.U字形,必须是先下再水平再上的那种,且一定是从左往右,贡献加1
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e3+10;
int x[N],y[N];
int cross(int x1,int y1,int x2,int y2){//向量的叉积
	return x1*y2-x2*y1;
}
int n;
void solve() {
	cin>>n;
	for(int i=0;i<n;i++) cin>>x[i]>>y[i];
	int ans=0;
	for(int i=0;i<n;i++){
		int j=i;
		while(y[j]==y[i]) j=(j+1)%n;
		int pre=(i-1+n)%n;
		if(y[i]<y[pre]&&y[i]<y[j]){
			if(y[i]!=y[(i+1)%n]){
				if(cross(x[i]-x[pre],y[i]-y[pre],x[j]-x[i],y[j]-y[i])>0) ans++;
			}
			else{
				if(x[(i+1)%n]>x[i]) ans++;
			}
		}
	}
	cout<<ans<<endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
//    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

B. Ropeway

题意:

在距离索道入口0和(n+1)单位距离的位置有索道站,给 出在1,2,··· ,n 单位距离架设支撑塔的成本,分别是 a1, a2,··· ,an。要求相邻支撑塔或索道站之间的距离必须小 于等于k。 成本序列会进行q次临时的修改(之后会复原),求出架设 支撑塔的最小总成本

首先考虑修改前,可以进行dp,dp[i]表示在第i个位置架设支撑塔的基础上的最小成本,转移的话,就从[i-k+1,i-1]转移过来,在长度为k的固定区间选取一个最小的dp[j]转移过来,这样的话时间复杂度是O(n^2)
有些位置是必须选择的,那么如果遇到某个位置必须选择,那么就将优先队列清空,将其放进去,保证它肯定被选择了

如何快速求滑动窗口的最小值,这是单调队列的一个应用

算法:单调队列_单调队列算法-CSDN博客

现在考虑修改,比如对第i个进行修改,那么dp[1],dp[2],...dp[i-1]是不受影响的,dp[i],dp[i+1],...dp[n+1]均受影响,重新维护肯定会超时,于是我们需要提前预处理last[i]表示在第i个位置架设支撑架的后缀最小成本,那么实际上如果第i个位置架设了支撑架的话,总的最小成本就是dp[i]+last[i]-a[i],减去a[i]是因为前缀已经算过一次了
所以我们只要确定某个位置i架设了支撑架,那么总体的最小成本就能立马算出来,由于长度为k的区间里必须有一个位置建设支撑架,否则学校相邻支撑架的距离大于k,那么我们只要计算一下dp[i],dp[i+1],...dp[i+k-1](k很小,这一部分枚举一遍即可),然后取最小的dp[j]+last[j]-a[j]
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=5e5+10;
int a[N];
int dp[N],last[N];
int tmp[N];
int n,k,Q;
string s;
void init(){
	deque<int>q;
	dp[0]=0;
	a[0]=0;
	q.push_back(0);
	for(int i=1;i<=n+1;i++){
		dp[i]=dp[q.front()]+a[i];
		if(s[i]=='1'){
			q.clear();
			q.push_back(i);
		}
		else{
			if(q.size()&&i-k+1>q.front()) q.pop_front();
			while(q.size()&&dp[q.back()]>dp[i]) q.pop_back();
			q.push_back(i);
		}
	}
	
	last[n+1]=0;
	a[n+1]=0;
	deque<int>qq;
	qq.push_back(n+1);
	for(int i=n;i>=1;i--){
		last[i]=last[qq.front()]+a[i];
		if(s[i]=='1'){
			qq.clear();
			qq.push_back(i);
		}
		else{
			if(qq.size()&&i+k-1<qq.front()) qq.pop_front();
			while(qq.size()&&last[qq.back()]>last[i]) qq.pop_back();
			qq.push_back(i);
		}
	}
}
void solve() {
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>s;
	s=' '+s;
	init();
	cin>>Q;
	while(Q--){
		int p,v;
		cin>>p>>v;
		deque<int>q;
		for(int i=max(0ll,p-k);i<=p-1;i++){
			if(s[i]=='1'){
				q.clear();
				q.push_back(i);
			}
			else{
				if(q.size()&&i-k+1>q.front()) q.pop_front();
				while(q.size()&&dp[q.back()]>dp[i]) q.pop_back();
				q.push_back(i);
			}
		}
		for(int i=p;i<=min(n+1,p+k-1);i++) tmp[i]=dp[i];
		int ans=1e18;
		for(int i=p;i<=min(n+1,p+k-1);i++){
			if(i==p) dp[i]=dp[q.front()]+v;
			else dp[i]=dp[q.front()]+a[i];
			if(s[i]=='1'){
				q.clear();
				q.push_back(i);
			}
			else{
				if(q.size()&&i-k+1>q.front()) q.pop_front();
				while(q.size()&&dp[q.back()]>dp[i]) q.pop_back();
				q.push_back(i);
			}
			ans=min(ans,dp[i]+last[i]-a[i]);
		}
		cout<<ans<<endl;
		for(int i=p;i<=min(n+1,p+k-1);i++) dp[i]=tmp[i];
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t=1;
    cin>>t;
	while(t--) {
		solve();
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

来电显示单位名称怎么设置?

在现代商务沟通中&#xff0c;来电显示单位名称已成为提升企业形象、增强客户信任的重要工具。想象一下&#xff0c;当拨打或接听电话时&#xff0c;如果对方的手机屏幕上能够显示出企业的单位名称和品牌标识&#xff0c;会有什么样的效果呢&#xff1f;毋庸置疑&#xff0c;这…

图为大模型一体机新探索,赋能智能家居行业

在21世纪的今天&#xff0c;科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网&#xff0c;从大数据到人工智能&#xff0c;每一项技术创新都在为人类带来前所未有的便利与效率。其中&#xff0c;图为AI大模型一体机作为人工智能领域的最新成果&#…

【Linux学习】(9)调试器gdb

前言 Linux基础工具&#xff1a;安装软件我们用的是yum&#xff0c;写代码用的是vim&#xff0c;编译代码用gcc/g&#xff0c;调试代码用gdb&#xff0c;自动化构建用make/Makefile&#xff0c;多人协作上传代码到远端用的是git。 在前面我们把yum、vim、gcc、make、git都已经学…

大数据新视界 -- 大数据大厂之大数据重塑影视娱乐产业的未来(4 - 2)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Leecode热题100-226.反转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

探讨Facebook的AI研究:未来社交平台的技术前瞻

在数字时代&#xff0c;社交媒体已成为人们日常生活的重要组成部分。作为全球最大的社交网络之一&#xff0c;Facebook不断致力于人工智能&#xff08;AI&#xff09;的研究与应用&#xff0c;以提升用户体验、增强平台功能并推动技术创新。本文将探讨Facebook在AI领域的研究方…

PHP计件工资平台系统小程序源码

&#x1f4bc;提升效率&#xff0c;精准计薪 ——「计件工资系统」全解析&#x1f4bc; &#x1f4ca;【告别繁琐&#xff0c;一键统计】&#x1f4ca; 你是否还在为每个月的计件工资统计而烦恼&#xff1f;繁琐的数据录入、核对&#xff0c;不仅耗时耗力&#xff0c;还容易出…

ClickHouse 3节点集群安装

ClickHouse 简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官方网站&#xff1a;https://clickhouse.com/ 项目地址&#xff1a;https://github.com/ClickHouse/ClickHouse 横向扩展集群介绍 此示例架构旨在提供可扩展性。它包括三个节点&#xff…

机器学习课程学习周报十八

机器学习课程学习周报十八 文章目录 机器学习课程学习周报十八摘要Abstract一、机器学习部分1. 再探Diffusion的数学原理1.1 回顾生成模型的任务1.2 DDPM (Denoising Diffusion Probabilistic Models)1.3 DDPM的证据下界 总结 摘要 本周周报深入探讨了Diffusion模型的数学原理…

JsonCpp库学习记录

使用源码的方式 到JsonCpp的开源库仓库下载最新的发行版本 解压压缩包 使用Python生成源码文件 在本路径下cmd打开控制台&#xff0c;使用python编译&#xff08;前提是python环境已安装&#xff09; python amalgamate.py 生成dist文件夹 jsoncpp为整合在一起的源码&#…

数通自学——VLAN虚拟局域网,eNSP实验讲解

VLAN虚拟局域网&#xff0c;eNSP实验讲解 一、概念二、eNSP仿真实验1、实验一&#xff1a;vlan演示&#xff08;交换机端口access模式&#xff09;2、实验二&#xff1a;vlan演示&#xff08;交换机端口trunk模式&#xff09; 一、概念 VLAN&#xff08;Virtual Local Area Ne…

vmware运维技巧总结

vmware使用实践总结 技巧一、在线添加硬盘技巧二、lvm脚本挂载硬盘 技巧一、在线添加硬盘 适用于不重启vmware虚拟机添加硬盘 首先控制台新加一块100G的硬盘 此时虚拟机内部是识别不到的&#xff0c;lsblk查看如下 不重启的情况下&#xff0c;采用如下方案 步骤一、查找主机…

智慧港口大屏可视化产品原型设计

全球贸易的快速发展和技术的不断进步&#xff0c;港口作为国际贸易的重要枢纽&#xff0c;其运营效率和管理水平直接影响到全球供应链的顺畅。智慧港口的概念应运而生&#xff0c;旨在通过新一代信息技术&#xff0c;将港口相关业务和管理创新深度融合&#xff0c;实现港口的高…

使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南

使用 Qt GRPC 构建高效的 Trojan-Go 客户端&#xff1a;详细指南 初识 Qt 和 gRPC 什么是 Qt&#xff1f;什么是 gRPC&#xff1f; 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…

利用Django实现MySQL数据库的内容在网页的增删改写

利用Django实现MySQL数据库的内容在网页的增删改写 1.建立项目2.定义模型3.创建视图4.创建模板5.创建表单和配置url6.最后修改7.效果 1.建立项目 输入命令django-admin startproject aaa 新建项目&#xff0c;项目名称命名为aaa&#xff0c;打开aaa文件夹&#xff0c;命令提示…

vscode 安装教程

双击vscode 安装包 同意&#xff0c;下一步 可以使用默认安装路径&#xff0c;也可以优化为这个 全选 取消勾选&#xff0c;点完成 在桌面创建一个空文件夹&#xff0c;拖动到vscode图标上 点击这个图标创建文件&#xff0c;注意必须以.py 结尾&#xff01;&#xff0…

第三十二篇:TCP协议粘包和滑动窗口,TCP系列七

上一篇《第三十一篇&#xff1a;TCP协议如何解决丢包的问题&#xff0c;TCP系列六》讲了TCP如何解决丢包问题&#xff0c;本文将为大家讲解TCP是如何提高传输效率&#xff0c;减少传输时延的原理。 1. TCP是如何提高传输效率&#xff0c;减少传输时延的 ① 粘包 如果传输的数…

下载数据集用于图像分类并自动分为训练集和测试集方法

一、背景 最近需要用Vision Transformer&#xff08;ViT&#xff09;完成图像分类任务&#xff0c;因此查到了WZMIAOMIAO的GitHub&#xff0c;里面有各种图像处理的方法。而图像处理的前期工作就是获取大量的数据集&#xff0c;用于训练模型参数&#xff0c;以准确识别或分类我…

国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播

在当今社会&#xff0c;视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而&#xff0c;由于不同厂家和平台之间的兼容性问题&#xff0c;视频监控系统的联网和整合面临巨大挑战。为了解决这个问题&#xff0c;国家制定了《公共安全视频监控联网系…

LabVIEW非接触式模态参数识别系统开发

基于LabVIEW的模态参数识别系统采用非接触式声学方法&#xff0c;结合LabVIEW软件和高精度硬件&#xff0c;实现机械结构模态参数的快速准确识别。降低了模态分析技术门槛&#xff0c;提高测试效率和准确性。 项目背景与意义: 传统的模态分析方法&#xff0c;如锤击法&#x…