2.15学习总结

2.15
1.聪明的质监员(二分+前缀和)
2.村村通(并查集)
3.玉蟾宫(悬线法DP)
4.随机排列(树状数组逆序对问题)
5.增进感情(DFS)

6.医院设置(floyd)

聪明的质监员https://www.luogu.com.cn/problem/P1314

题目描述

小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 �n 个矿石,从 11 到 �n 逐一编号,每个矿石都有自己的重量 ��wi​ 以及价值 ��vi​ 。检验矿产的流程是:

  1. 给定�m 个区间 [��,��][li​,ri​];

  2. 选出一个参数 �W;

  3. 对于一个区间 [��,��][li​,ri​],计算矿石在这个区间上的检验值 ��yi​:

��=∑�=����[��≥�]×∑�=����[��≥�]��yi​=j=li​∑ri​​[wj​≥W]×j=li​∑ri​​[wj​≥W]vj​

其中 �j 为矿石编号。

这批矿产的检验结果 �y 为各个区间的检验值之和。即:∑�=1���i=1∑m​yi​

若这批矿产的检验结果与所给标准值 �s 相差太多,就需要再去检验另一批矿产。小T 不想费时间去检验另一批矿产,所以他想通过调整参数 �W 的值,让检验结果尽可能的靠近标准值 �s,即使得 ∣�−�∣∣s−y∣ 最小。请你帮忙求出这个最小值。

输入格式

第一行包含三个整数 �,�,�n,m,s,分别表示矿石的个数、区间的个数和标准值。

接下来的 �n 行,每行两个整数,中间用空格隔开,第 �+1i+1 行表示 �i 号矿石的重量 ��wi​ 和价值 ��vi​。

接下来的 �m 行,表示区间,每行两个整数,中间用空格隔开,第 �+�+1i+n+1 行表示区间 [��,��][li​,ri​] 的两个端点 ��li​ 和 ��ri​。注意:不同区间可能重合或相互重叠。

输出格式

一个整数,表示所求的最小值。

输入输出样例

输入 #1复制

5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3 

输出 #1复制

10

说明/提示

【输入输出样例说明】

当 �W 选 44 的时候,三个区间上检验值分别为 20,5,020,5,0 ,这批矿产的检验结果为 2525,此时与标准值 �S 相差最小为 1010。

【数据范围】

对于 10%10% 的数据,有 1≤�,�≤101≤n,m≤10;

对于 30%30%的数据,有 1≤�,�≤5001≤n,m≤500 ;

对于 50%50% 的数据,有 1≤�,�≤5,0001≤n,m≤5,000;

对于 70%70% 的数据,有 1≤�,�≤10,0001≤n,m≤10,000 ;

对于 100%100% 的数据,有 1≤�,�≤200,0001≤n,m≤200,000,0<��,��≤1060<wi​,vi​≤106,0<�≤10120<s≤1012,1≤��≤��≤�1≤li​≤ri​≤n 。

思路:每次找的时候用前缀和存,不然会TLE

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
const int N=2e5+5;int n,m,s,min1=INF,maxn,minn=INF,sum,ans;	//矿石,区间,标准值int w[N],v[N],l[N],r[N],pre_v[N],pre_n[N];bool check(int k){ans=0,sum=0;memset(pre_v,0,sizeof(pre_v));memset(pre_n,0,sizeof(pre_n));for (int i=1;i<=n;++i){if (w[i]>=k){pre_v[i]=pre_v[i-1]+v[i];pre_n[i]=pre_n[i-1]+1;}else{pre_v[i]=pre_v[i-1];pre_n[i]=pre_n[i-1];}}for (int i=1;i<=m;++i){ans+=(pre_n[r[i]]-pre_n[l[i]-1])*(pre_v[r[i]]-pre_v[l[i]-1]);}sum=abs(ans-s);if (ans>s) return true;else return false;
}signed main(){cin>>n>>m>>s;for (int i=1;i<=n;++i){cin>>w[i]>>v[i];maxn=max(maxn,w[i]);minn=min(minn,w[i]);} for (int i=1;i<=m;++i){cin>>l[i]>>r[i];}minn=minn-1,maxn=maxn+2;while (minn<=maxn){int mid=minn+maxn>>1;if (check(mid)) minn=mid+1;else maxn=mid-1;if (sum<min1) min1=sum;}cout<<min1;
} 
村村通https://www.luogu.com.cn/problem/P1536

题目描述

某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 "村村通工程" 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?

输入格式

输入包含若干组测试数据,每组测试数据的第一行给出两个用空格隔开的正整数,分别是城镇数目 �n 和道路数目 �m ;随后的 �m 行对应 �m 条道路,每行给出一对用空格隔开的正整数,分别是该条道路直接相连的两个城镇的编号。简单起见,城镇从 11 到 �n 编号。

注意:两个城市间可以有多条道路相通。

在输入数据的最后,为一行一个整数 00,代表测试数据的结尾。

输出格式

对于每组数据,对应一行一个整数。表示最少还需要建设的道路数目。

输入输出样例

输入 #1复制

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

输出 #1复制

1
0
2
998

说明/提示

数据规模与约定

对于 100%100% 的数据,保证 1≤�<10001≤n<1000 。

思路:并查集,把所有的关系都连接起来,然后遍历所有情况,找到没有连接的,计数器自增

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
const int N=2e5+5;int f[N],n,m,cnt,p;int find(int x){if (f[x]==x) return x;else if (f[x]!=x){f[x]=find(f[x]);return f[x];}
}void merge(int i,int j){f[find(i)]=find(j);
}signed main(){while (1){cnt=0;cin>>n;if (n==0) return 0;cin>>m;for (int i=1;i<=n;++i) f[i]=i;for (int i=0;i<m;++i){int a,b;p=a;cin>>a>>b;merge(a,b);}for (int i=1;i<=n;++i){if (find(i)!=find(p)){cnt++;merge(i,p);}}cout<<cnt<<endl;;}
}
玉蟾宫https://www.luogu.com.cn/problem/P4147

题目背景

有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

题目描述

这片土地被分成 �×�N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 'F' 并且面积最大。

但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 �S,它们每人给你 �S 两银子。

输入格式

第一行两个整数 �N,�M,表示矩形土地有 �N 行 �M 列。

接下来 �N 行,每行 �M 个用空格隔开的字符 'F' 或 'R',描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即 (3×最大 ’F’ 矩形土地面积3×最大 ’F’ 矩形土地面积) 的值。

输入输出样例

输入 #1复制

5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F

输出 #1复制

45

说明/提示

对于 50%50% 的数据,1≤�,�≤2001≤N,M≤200。
对于 100%100% 的数据,1≤�,�≤10001≤N,M≤1000。

思路:用悬线法写,l数组存每个点向左最多可以到哪里,r数组为右,h数组存的是向上最多可以到哪里,但是在找h数组的时候,需要同时判断垂直的点,lr数组的关系

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
const int N=1010;int h[N][N],m,n,l[N][N],r[N][N];
char a[N][N];signed main(){cin>>n>>m;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){cin>>a[i][j];if (a[i][j]=='F')h[i][j]=1;l[i][j]=j;r[i][j]=j;}}for (int i=1;i<=n;++i){for (int j=2;j<=m;++j){if (a[i][j]=='F' && a[i][j-1]=='F'){l[i][j]=l[i][j-1];}}for (int j=m-1;j>=1;--j){if (a[i][j]=='F' && a[i][j+1]=='F'){r[i][j]=r[i][j+1];}}}int ans=0;for (int i=1;i<=n;++i){for (int j=1;j<=m;++j){if (a[i][j]=='F' && a[i-1][j]=='F'){h[i][j]=h[i-1][j]+1;l[i][j]=max(l[i][j],l[i-1][j]);r[i][j]=min(r[i][j],r[i-1][j]);}if (a[i][j]=='F')ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]);}}cout<<ans*3;
}
随机排列https://www.acwing.com/problem/content/5469/

给定一个 1∼n1∼� 的排列 a1,a2,…,an�1,�2,…,��。

我们规定,交换操作指从排列中随机选择两个不同元素并交换彼此位置。

给定两种打乱排列的方式:

  1. 对排列连续进行 3n3� 次交换操作。
  2. 对排列连续进行 7n+17�+1 次交换操作。

已知,给定排列 a1∼an�1∼�� 就是由 1,2,…,n1,2,…,� 经过上述两种打乱方式之一得到的。

请你判断,给定排列具体是由哪一种打乱方式得到的。

输入格式

第一行包含整数 n�。

第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。

输出格式

如果给定排列是由方式 11 打乱得到的,则输出 11,如果给定排列是由方式 22 打乱得到的,则输出 22。

保证给定排列一定是由两种打乱方式之一得到的。

数据范围

前 33 个测试点满足 2≤n≤102≤�≤10。
所有测试点满足 2≤n≤1062≤�≤106,保证 a1∼an�1∼�� 是一个 1∼n1∼� 的排列。

输入样例:
5
2 4 5 1 3
输出样例:
1

思路:本质上是找逆序数,由于每次改变都会改变逆序数的奇偶性,所以,当前数组的逆序数个数的奇偶性与改变次数的奇偶性相同

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 1e6+5;
int tr[N],w[N];int lowbit(int x){return x & -x;
}void update(int x, int k){while(x<=N){tr[x]+=k;x+=lowbit(x);}
}int query(int x){int res=0;while (x>0){res+=tr[x];x-=lowbit(x);}return res;
}int main()
{int n;cin>>n;int res=0;for (int i = 0; i < n; ++ i ){int x;cin>>x;res=(res+query(n)-query(x))%2;update(x,1);}if (res== 3*n%2) cout<<1;else cout << 2;
}
增进感情https://www.luogu.com.cn/problem/P2080

题目背景

小明和小红的感情,是慢慢发展起来的。

题目描述

他们对对方分别有一个好感值。定义两人的亲密程度为两人的好感值之和。

如果他们的亲密程度达到 �v,则他们将走到一起。他们以后的生活将取决于两人的好感值之差的绝对值,这个值越小,他们的生活将越幸福。

现在,他们对对方的好感值都为 00,小明有 �n 件事可以干,每件事可以增加他对小红的好感 ��ai​ 点,并且增加小红对他的好感 ��bi​ 点。(可能为负数)

小明可以任选一些事做,请你帮小明求出怎样才能让他们的生活更加幸福(求出两人在一起的前提下,好感值之差的最小绝对值即可)。

输入格式

第一行,两个正整数 �,�n,v。

之后 �n 行,每行两个空格隔开的整数 ��,��ai​,bi​。

输出格式

一行,一个非负整数,表示两人在一起的前提下,好感值之差的最小绝对值。如果无论如何两人也无法在一起,输出 -1

输入输出样例

输入 #1复制

4 15
5 6
-1 8
7 2
1 0

输出 #1复制

3

说明/提示

数据范围与约定

  • 对于 20%20% 数据,保证 �≤10n≤10。

  • 对于 100%100% 数据,保证 1≤�≤301≤n≤30,1≤∣��∣,∣��∣≤1001≤∣ai​∣,∣bi​∣≤100。

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fconst int N=35;int n,v,ans=INF,l,r;
int a[N],b[N],vis[N];void dfs(int idx){if (l+r>=v){ans=min(ans,abs(l-r));}if (idx>n || ans==0){return ;}for (int i=idx;i<=n;++i){if (!vis[i]){vis[i]=1;l+=a[i],r+=b[i];dfs(i+1);l-=a[i],r-=b[i];vis[i]=0;}}
}signed main(){cin>>n>>v; 	//v是最大的好感度for (int i=1;i<=n;++i){cin>>a[i]>>b[i];} dfs(1);if (ans==INF) cout<<-1;else cout<<ans;
}
医院设置https://www.luogu.com.cn/problem/P1364

题目描述

设有一棵二叉树,如图:

其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为 11。如上图中,若医院建在 11 处,则距离和 =4+12+2×20+2×40=136=4+12+2×20+2×40=136;若医院建在 33 处,则距离和 =4×2+13+20+40=81=4×2+13+20+40=81。

输入格式

第一行一个整数 �n,表示树的结点数。

接下来的 �n 行每行描述了一个结点的状况,包含三个整数 �,�,�w,u,v,其中 �w 为居民人口数,�u 为左链接(为 00 表示无链接),�v 为右链接(为 00 表示无链接)。

输出格式

一个整数,表示最小距离和。

输入输出样例

输入 #1复制

5     
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0

输出 #1复制

81

说明/提示

数据规模与约定

对于 100%100% 的数据,保证 1≤�≤1001≤n≤100,0≤�,�≤�0≤u,v≤n,1≤�≤1051≤w≤105。

思路:n<=100数据量小,可以用floyd算法,找到最短路径,然后根据权,再遍历所有的点找到最适合的点

#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x& - (x))
#define int long long
#define INF 0x3f3f3f3f3f3f3f3fconst int N=105;int n,a[N][N],w[N];signed main(){cin>>n;for (int i=1;i<=n;++i){for (int j=1;j<=n;++j){if (i==j) a[i][j]=0;else a[i][j]=INF;}}for (int i=1;i<=n;++i){int l,r;cin>>w[i]>>l>>r;if (l>0) a[i][l]=a[l][i]=1;if (r>0) a[i][r]=a[r][i]=1;}for (int k=1;k<=n;++k){for (int i=1;i<=n;++i){for (int j=1;j<=n;++j){a[i][j]=min(a[i][j],a[i][k]+a[k][j]);}}}int sum=INF;for (int i=1;i<=n;++i){int cnt=0;for (int j=1;j<=n;++j){cnt+=a[i][j]*w[j];	}sum=min(sum,cnt);}cout<<sum;
}

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

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

相关文章

《动手学深度学习(PyTorch版)》笔记8.7

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

C++数据结构与算法——双指针法

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

NLP_ChatGPT的RLHF实战

文章目录 介绍小结 介绍 ChatGPT 之所以成为ChatGPT&#xff0c;基于人类反馈的强化学习是其中重要的一环。而ChatGPT 的训练工程称得上是复杂而又神秘的&#xff0c;迄今为止&#xff0c;OpenAl也没有开源它的训练及调优的细节。 从 OpenAl已经公开的一部分信息推知&#xff…

计算机组成原理(2)-----存储芯片与CPU的连接

目录 一.单块存储芯片与CPU的连接 二.多块存储芯片与CPU的连接 1.位扩展 2.字扩展 &#xff08;1&#xff09;线选法 &#xff08;2&#xff09;译码器片选法 3.字位同时扩展 三.译码器相关 一.单块存储芯片与CPU的连接 如图所示是8*8位的芯片&#xff0c;总共8个存储…

OS设备管理

设备管理 操作系统作为系统资源的管理者&#xff0c;其提供的功能有&#xff1a;处理机管理、存储器管理、文件管理、设备管理。其中前三个管理都是在计算机的主机内部管理其相对应的硬件。 I/O设备 I/O即输入/输出。I/O设备即可以将数据输入到计算机&#xff0c;或者可以接收…

高校危化试剂管理:Java与SpringBoot的革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Vue核心基础6:Vue内置指令、自定义指令、生命周期

1 Vue中的内置指令 <script>const vm new Vue({el: #root,data: {n: 1,m: 100,name: Vue,str: <h3>你好</h3>}})</script> 1.1 v-text <div v-text"name"></div>1.2 v-html <div v-html"str"></div> …

最小生成树(Kruskal算法及相关例题)

1.Kruskal算法概念以及基本思路 &#xff08;1&#xff09;概念&#xff1a; 克鲁斯卡尔算法是求连通网的最小生成树的另一种方法。它的时间复杂度为O&#xff08;ElogE&#xff09;(E是图G的边的总数)&#xff0c;适合于求边稀疏的网的最小生成树 。 其基本思想是&#xff…

黄金交易策略(Nerve Nnife.mql4):做单手数设计

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 NK的做单量是由参数设定的&#xff0c;以下分别是参数项&#xff1a; 考虑到复利的情况&#xff0c;若10000本金&#xff0c;在以上三个参数的设计下&#xff0c;第1单的购买量是0.01*10,第2单是0.01*10*2…

Java迭代器详解,看这一篇就够了

文章目录 &#x1f6a9;Java 迭代器详解 &#x1f4da;迭代器的定义 &#x1f4d2;认识Iterator ✏️类结构图 ✒️Iterable接口 &#x1f58d;️Iterator接口 &#x1f4c3;Iterator接口的方法 &#x1f4d9;迭代器的使用 &#x1f3f7;️使用迭代器遍历集合 &#x1f516;Ite…

[BIZ] - 1.金融交易系统特点

1. 典型数据汇总 数据 说明 新增数据量(条/天) Qps(条/s) 消息大小(Byte) 实时性 可丢失性 可恢复性 实时行情 1.使用场景&#xff1a;交易&#xff0c;报价&#xff0c;策略验证&#xff1b; 2.冷热分离&#xff1a;彭博行情/其他行情&#xff1b;黄金&期货行情/…

Java图形化界面编程——AWT概论 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…

交通管理|交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)

交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…

MySQL学习Day15——MySQL安装与使用

一、Linux下的MySQL的安装与使用: 卸载MySQL: 1.关闭当前MySQL服务:systemctl stop mysql.service 2.查看当前mysql安装状况:rpm -qa | grep -i mysql 3.卸载上述命令查询出的已安装的程序:yum remove mysql-xxx mysql-xxx mysql-xxxx 4.删除mysql相关文件: (1)查找相关文…

解决vscode报错,在赋值前使用了变量“XXX“

问题&#xff1a;如图所示 解决方法&#xff1a; 法一&#xff1a; 补全函数使其完整 法二&#xff1a; 使用断言

c++Qt网络操作

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况&#xff1a; 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…

【STM32 CubeMX】串口编程DMA

文章目录 前言一、DMA方式1.1 DMA是什么1.2 CubeMX配置DMA1.3 DMA方式函数使用DMA的发送接收函数 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项至关重要的功能&#xff0c;它允许单片机与外部设备进行数据交换&#xff0c;如传感器、显示器或其他设备。然而&#xff0…

Linux笔记之xhost +和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解

Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解 ——2024-02-11 code review! 文章目录 Linux笔记之xhost 和docker的关系以及GDK_SCALE和GDK_DPI_SCALE详解xhost 的作用xhost 与 Docker 的关系 -e GDK_SCALE 和 -e GDK_DPI_SCALE详解GDK_SCALEGDK_DPI_SC…

【Linux】进程的初步认识

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程&#xff0c;首先我们要知道两点 我们可以同时启动多个程序&#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

036-安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

036-安全开发-JavaEE应用&第三方组件&Log4j日志&FastJson序列化&JNDI注入 #知识点&#xff1a; 1、JavaEE-组件安全-Log4j 2、JavaEE-组件安全-Fastjson 3、JavaEE-基本了解-JNDI-API 演示案例&#xff1a; ➢Java-三方组件-Log4J&JNDI ➢Java-三方组件-Fa…