2.20学习总结

1.【模板】单源最短路径(弱化版)
2.【模板】单源最短路径(标准版)
3.无线通讯网
4.子串简写
5.整数删除
6.拆地毯

【模板】单源最短路径(标准版)https://www.luogu.com.cn/problem/P4779

题目描述

给定一个 �n 个点,�m 条有向边的带非负权图,请你计算从 �s 出发,到每个点的距离。

数据保证你能从 �s 出发到任意点。

输入格式

第一行为三个正整数 �,�,�n,m,s。 第二行起 �m 行,每行三个非负整数 ��,��,��ui​,vi​,wi​,表示从 ��ui​ 到 ��vi​ 有一条权值为 ��wi​ 的有向边。

输出格式

输出一行 �n 个空格分隔的非负整数,表示 �s 到每个点的距离。

输入输出样例

输入 #1复制

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出 #1复制

0 2 4 3

说明/提示

样例解释请参考 数据随机的模板题。

1≤�≤1051≤n≤105;

1≤�≤2×1051≤m≤2×105;

�=1s=1;

1≤��,��≤�1≤ui​,vi​≤n;

0≤��≤1090≤wi​≤109,

0≤∑��≤1090≤∑wi​≤109。

【模板】单源最短路径(标准版)https://www.luogu.com.cn/problem/P3371

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入格式

第一行包含三个整数 �,�,�n,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 �m 行每行包含三个整数 �,�,�u,v,w,表示一条 �→�u→v 的,长度为 �w 的边。

输出格式

输出一行 �n 个整数,第 �i 个表示 �s 到第 �i 个点的最短路径,若不能到达则输出 231−1231−1。

输入输出样例

输入 #1复制

4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

输出 #1复制

0 2 4 3

说明/提示

【数据范围】
对于 20%20% 的数据:1≤�≤51≤n≤5,1≤�≤151≤m≤15;
对于 40%40% 的数据:1≤�≤1001≤n≤100,1≤�≤1041≤m≤104;
对于 70%70% 的数据:1≤�≤10001≤n≤1000,1≤�≤1051≤m≤105;
对于 100%100% 的数据:1≤�≤1041≤n≤104,1≤�≤5×1051≤m≤5×105,1≤�,�≤�1≤u,v≤n,�≥0w≥0,∑�<231∑w<231,保证数据随机。

Update 2022/07/29:两个点之间可能有多条边,敬请注意。

对于真正 100%100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

样例说明:

图片1到3和1到4的文字位置调换

思路:dijkstra

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fconst int N=2e5+5;struct edge{int from;int to;int w;edge(int a,int b,int c){from=a;to=b;w=c;}
};
vector<edge>e[N];
struct node{int id;int n_dis;node(int a ,int b){id=a;n_dis=b;}bool operator < (const node& a)const{return n_dis>a.n_dis;}
}; int n,m,s,dis[N];
bool done[N];
priority_queue<node>q;void dijkstra(int s){for (int i=1;i<=n;++i){dis[i]=INF;done[i]=false;}dis[s]=0;q.push(node(s,dis[s]));while (!q.empty()){node p=q.top(); q.pop();if (done[p.id]) continue;done[p.id]=true;for (int i=0;i<e[p.id].size();++i){edge y=e[p.id][i];if (done[y.to]) continue;if (dis[y.to] > p.n_dis+y.w){dis[y.to]=p.n_dis+y.w;q.push(node(y.to,dis[y.to]));}}}
}signed main(){cin>>n>>m>>s;for (int i=0;i<m;++i){int u,v,w;cin>>u>>v>>w;e[u].push_back(edge(u,v,w));}dijkstra(s);for (int i=1;i<=n;++i){cout<<dis[i]<<" ";}
} 
无线通讯网https://www.luogu.com.cn/problem/P1991

题目描述

国防部计划用无线网络连接若干个边防哨所。2 种不同的通讯技术用来搭建无线网络;

每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。

任意两个配备了一条卫星电话线路的哨所(两边都有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过 �D,这是受收发器的功率限制。收发器的功率越高,通话距离 �D 会更远,但同时价格也会更贵。

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个 �D。你的任务是确定收发器必须的最小通话距离 �D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

输入格式

第一行,22 个整数 �S 和 �P,�S 表示可安装的卫星电话的哨所数,�P 表示边防哨所的数量。

接下里 �P 行,每行两个整数 �,�x,y 描述一个哨所的平面坐标 (�,�)(x,y),以 km 为单位。

输出格式

第一行,11 个实数 �D,表示无线电收发器的最小传输距离,精确到小数点后两位。

输入输出样例

输入 #1复制

2 4
0 100
0 300
0 600
150 750

输出 #1复制

212.13

说明/提示

数据范围及约定

  • 对于 20%20% 的数据:�=2,�=1P=2,S=1;

  • 对于另外 20%20% 的数据:�=4,�=2P=4,S=2;

  • 对于 100%100% 的数据保证:1≤�≤1001≤S≤100,�<�≤500S<P≤500,0≤�,�≤100000≤x,y≤10000。

思路:Kruskal

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fconst int N=505;int f[N],s,p;
double dis;
double a[N][2];
struct edge{int from;int to;double w;
};
edge e[N*N];
int find(int x){if (f[x]==x) return x;else{f[x]=find(f[x]);return f[x];}
}bool cmp(const edge& a , const edge& b){return a.w<b.w;
}void unionn(int x,int y){f[find(x)]=find(y);
}signed main(){cin>>s>>p;for (int i=1;i<=p;++i) f[i]=i;for (int i=1;i<=p;++i){cin>>a[i][0]>>a[i][1];}int bian=0;for (int i=1;i<=p;++i){for (int j=i+1;j<=p;++j){++bian;e[bian].from=i;e[bian].to=j;e[bian].w=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));}}sort(e+1,e+1+bian,cmp);int cnt=0;for (int i=1;i<=bian;++i){if (find(e[i].from) != find(e[i].to)){unionn(e[i].from,e[i].to);cnt++;dis=max(e[i].w,dis);}if (cnt==p-s) break;}printf("%.2lf",dis);
}
拆地毯https://www.luogu.com.cn/problem/P2121

题目描述

会场上有 n 个关键区域,不同的关键区域由 m 条无向地毯彼此连接。每条地毯可由三个整数 u、v、w 表示,其中 u 和 v 为地毯连接的两个关键区域编号,w 为这条地毯的美丽度。

由于颁奖典礼已经结束,铺过的地毯不得不拆除。为了贯彻勤俭节约的原则,组织者被要求只能保留至多 K 条地毯,且保留的地毯构成的图中,任意可互相到达的两点间只能有一种方式互相到达。换言之,组织者要求新图中不能有环。现在组织者求助你,想请你帮忙算出这至多 K 条地毯的美丽度之和最大为多少。

输入格式

第一行包含三个正整数 n、m、K。

接下来 m 行中每行包含三个正整数 u、v、w。

输出格式

只包含一个正整数,表示这 K 条地毯的美丽度之和的最大值。

输入输出样例

输入 #1复制

5 4 3
1 2 10
1 3 9
2 3 7
4 5 3

输出 #1复制

22

说明/提示

选择第 1、2、4 条地毯,美丽度之和为 10 + 9 + 3 = 22。

若选择第 1、2、3 条地毯,虽然美丽度之和可以达到 10 + 9 + 7 = 26,但这将导致关键区域 1、2、3 构成一个环,这是题目中不允许的。

1<=n,m,k<=100000

思路:最大生成树

#include <bits/stdc++.h>
using namespace std;
#define int long longconst int N = 1e5+5;struct edge{int from;int to;int w;
};edge e[N];
int f[N],n,m,k,cnt,sum;int find(int x){if (f[x]==x) return x;else{f[x]=find(f[x]);return f[x];}
}void unionn(int i,int j){f[find(i)]=find(j);
}bool cmp(const edge& a,const edge& b){return  a.w>b.w;
}signed main(){cin>>n>>m>>k;for (int i=1;i<=n;++i) f[i]=i;for (int i=1;i<=m;++i){int u,v,w;cin>>u>>v>>w;e[i].from=u;e[i].to=v;e[i].w=w;}sort(e+1,e+1+m,cmp);for (int i=1;i<=m;++i){if (find(e[i].from)!=find(e[i].to)){unionn(e[i].from,e[i].to);sum+=e[i].w;cnt++;}if (cnt==k) break;}cout<<sum;
}

子串简写https://www.dotcpp.com/oj/problem3154.html

题目描述

程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如 internation-alization 简写成 i18n,Kubernetes (注意连字符不是字符串的一部分)简写成 K8s, Lanqiao 简写成 L5o 等。

在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法(长度小于 K 的字符串不配使用这种简写)。

给定一个字符串 S 和两个字符 c1 和 c2,请你计算 S 有多少个以 c1 开头c2 结尾的子串可以采用这种简写?

输入格式

第一行包含一个整数 K。

第二行包含一个字符串 S 和两个字符 c1 和 c2。

输出格式

一个整数代表答案。

样例输入

复制

4
abababdb a b

样例输出

复制

6

提示

符合条件的子串如下所示,中括号内是该子串:

[abab]abdb

[ababab]db

[abababdb]

ab[abab]db

ab[ababdb]

abab[abdb]

对于 20% 的数据,2 ≤ K ≤ |S | ≤ 10000。

对于 100% 的数据,2 ≤ K ≤ |S | ≤ 5 × 105。S 只包含小写字母。c1 和 c2 都是小写字母。

|S | 代表字符串 S 的长度。

思路:数据的大小到了10的五次,所以用双重循环肯定会TLE,所以选择优化一下,用一重循环,把前面的可以形成的用计数器记录,然后想后遍历,如果遇到计数器加一,如果遍历到c2,那么就加到总数上

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fstring s;
char c1,c2;
int k;signed main(){cin>>k;cin>>s;cin>>c1>>c2;int cnt=0,n=0;for (int i=0;i<s.size();++i){if (i-k+1>=0 && s[i-k+1]==c1) n++;if (s[i]==c2) cnt+=n;}cout<<cnt;
}

整数删除https://www.dotcpp.com/oj/problem3155.html

题目描述

给定一个长度为 N 的整数数列:A1, A2, . . . , AN。你要重复以下操作 K 次:

每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除。并把与它相邻的整数加上被删除的数值。输出 K 次操作后的序列。

输入格式

第一行包含两个整数 N 和 K。

第二行包含 N 个整数,A1, A2, A3, . . . , AN。

输出格式

输出 N − K 个整数,中间用一个空格隔开,代表 K 次操作后的序列。

样例输入

复制

5 3
1 4 2 8 7

样例输出

复制

17 7

提示

数列变化如下,中括号里的数是当次操作中被选择的数:

[1] 4 2 8 7

5 [2] 8 7

[7] 10 7

17 7

对于 20% 的数据,1 ≤ K < N ≤ 10000。

对于 100% 的数据,1 ≤ K < N ≤ 5 × 105,0 ≤ Ai ≤ 108。

思路:双向链表加上堆优化

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fconst int N=5e5+5;int v[N], l[N], r[N];struct node1{int id;int w;node1(int a,int b){id=a;w=b;}bool operator < (const node1& a)const{if (w==a.w) return id > a.id; else return w>a.w;}
};priority_queue<node1>q;	//存节点的值和下标 
int n,k;void sc(int x){r[l[x]] = r[x], l[r[x]] = l[x];v[l[x]] += v[x], v[r[x]] += v[x];
}signed main(){cin>>n>>k;r[0] = 1, l[n + 1] = n;for (int i=1;i<=n;++i){cin >> v[i], l[i] = i - 1, r[i] = i + 1, q.push(node1(i, v[i]));}while (k--){node1 p=q.top(); q.pop();		if (p.w!=v[p.id]){q.push(node1(p.id,v[p.id]));k++;}else{sc(p.id);}}int head = r[0];while (head != n + 1) {cout << v[head]<< " ";head = r[head];}
}

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

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

相关文章

Excel SUMPRODUCT函数用法(乘积求和,分组排序)

SUMPRODUCT函数是Excel中功能比较强大的一个函数&#xff0c;可以实现sum,count等函数的功能&#xff0c;也可以实现一些基础函数无法直接实现的功能&#xff0c;常用来进行分类汇总&#xff0c;分组排序等 SUMPRODUCT 函数基础 SUMPRODUCT函数先计算多个数组的元素之间的乘积…

Kubernetes安装nginx-controller作为统一网关

nginx-controller是什么呢? 它是一个能调度nginx的一个kubernetes operator,它能监听用户创建,更新,删除NginxConf对象,来调度本地的nginx实现配置的动态更新。如添加新的代理(http,https,tcp,udp),缓存(浏览器缓存,本地缓存),ssl证书(配置本身,ConfigMap,Secret),更新,删除等…

c语言结构体与共用体

前面我们介绍了基本的数据类型 在c语言中 有一种特殊的数据类型 由程序员来定义类型 目录 一结构体 1.1概述 1.2定义结构体 1.3 结构体变量的初始化 1.4 访问结构体的成员 1.5结构体作为函数的参数 1.6指向结构的指针 1.7结构体大小的计算 二共用体 2.1概述 2.2 访…

04 Aras Innovator二次开发-客户端方法

客户端方法为JS方法。 系统提供了很多触发点&#xff0c;可以嵌入客户端方法&#xff0c;如下&#xff1a; 1 对象类的客户端事件页签&#xff1a; 2 窗体的Form Event和Filed Event 3.关系类的网格事件&#xff1a; 4 属性事件&#xff1a; 5.可自定义Action,触发客户端事件…

数据结构与算法:栈

朋友们大家好啊&#xff0c;在链表的讲解过后&#xff0c;我们本节内容来介绍一个特殊的线性表&#xff1a;栈&#xff0c;在讲解后也会以例题来加深对本节内容的理解 栈 栈的介绍栈进出栈的变化形式 栈的顺序存储结构的有关操作栈的结构定义与初始化压栈操作出栈操作获取栈顶元…

VR全景开启线上卖房新渠道,助力房企改变营销方式

当下房产行业&#xff0c;还在依靠传统线下发传单、跑客户、做地推吗&#xff1f;在短视频和直播火热的今天&#xff0c;房产行业也开启了线上卖房的新渠道&#xff0c;通过VR全景技术&#xff0c;可以为各个小区的线上宣传增加趣味性和互动性。 一、VR全景漫游可以彰显房源真实…

如何更换过期的SSL证书?

SSL证书是保护网站安全的重要组成部分&#xff0c;它能在客户端和服务器之间建立数据传输加密通道&#xff0c;防止数据在传输过程中被泄露、劫持和窃听。但SSL证书也有有效期限&#xff0c;当SSL证书到期时&#xff0c;您需要及时更换它&#xff0c;以确保网站的安全性和可信度…

Git基本操作(2)

Git基本操作&#xff08;2&#xff09; 上交文件之后&#xff0c;git文件的变化git cat-file HEAD指针里面有啥文件被修改git statusgit diff 文件名 版本回退&#xff08;git reset&#xff09;撤销回退git reflog 撤销的三种情况还没有addgit checkout -- [file] 已经add还没…

Pandas快问快答16-30题

16. 如何对一个Pandas数据框进行聚合操作? 聚合操作是数据处理中的一种重要方式&#xff0c;主要用于对一组数据进行汇总和计算&#xff0c;以得到单一的结果。在聚合操作中&#xff0c;可以执行诸如求和、平均值、最大值、最小值、计数等统计操作。这些操作通常用于从大量数…

Vue-Ajax核心知识整理

在Vue框架中可以有很多方式实现 ajax, 其中有xhr、jQuery、fetch、axios、vue-resource, 其中Vue的作者尤雨溪推荐使用axios&#xff0c;所以在使用Vue框架时&#xff0c;尽量还是使用axios 但是当我们使用ajax时&#xff0c;经常会遇到跨域的问题&#xff0c;比如你本地的端口…

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式&#xff0c;一个job一个集群&#xff0c;提交时yarn才分配集群资源&#xff1b; 主要的进程&#xff1a;JobManager、TaskManager、Client 提交命令&#xff1a;bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…

Unity—JSON

每日一句&#xff1a;手简素中&#xff0c;感生活恬淡&#xff0c;心有所期&#xff0c;忙而不茫 目录 服务器 常见的服务器语言 Unity的开发语言 JSON 功能&#xff1a; JSON最简单的格式 JSON工具 支持的数据结构&#xff08;C#对于JSON&#xff09; 字符含义 JSON…

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

2023年12月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(共15题,共30分) 第1题 下面有关函数参数的说法,正确的是( )。 A:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。 B:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子…

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

vue项目调用摄像头实现拍照功能

目录 1.功能需求 2.API 3.完整代码 4.效果 5.遇到问题 1.功能需求 需求:下面需求图 本来应该使用小程序做&#xff0c;但是为了以后复用考虑&#xff0c;决定使用vue嵌入小程序中。 所以需求就是 调用手机摄像头 实现拍照打卡功能&#xff08;电脑通用&#xff09; 2.API …