结构体的一些小技巧

有一天在写洛谷的一道题的时候,我想出来大概思路,但是有几步我想破头也无法实现。

后来看了题解,发现原来结构体可以这样使用。

比如,现在有一个结构体: 

struct person {char gender;int age, high, height;
};

它表示的是一个人的一些信息。

然后又给你一个vector容器,里面装的是person类型的元素

vector<person> a;

嗯。。如果我们要将gender,age,high,height都导入进容器里面应该怎么做?

vector<person> a;int main() {a.push_back(person{ 'F', 18, 180, 150});person t = a[0];cout << t.age;
}

只需要按照这个格式:

 push_back( 结构体名字{  // 按照成员变量定义的顺序写你想要赋的值// } )

切记,一定要按照顺序结构体里的顺序赋值。

好的,现在我们给出那道题目:           

P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1878


简述一下,我第一次想的思路是将 (异性 and 相邻的差值 )插入最小堆里面
因为,题目要求,如果差值相等,输出最左边的一对,所以我们需要记录每个人站的编号。

然后又因为,如果出列了一对,那么这一对的左右两边的人要自动补齐,所以这样就又多了一对的数据,把这一对数据插入最小堆即可。 这一对的数据很好得到,就是出列的那一对的左边和右边,所以我当时想到了链表。

嗯。。。不过我足足调试了两小时,因为初步的内容很粗糙,细节不够到位。

  • 编号为0和编号为n+1的点怎么办?
  • 怎么实现如果两数相等让左边的先出列
  • 出列的终止条件是什么

最后我想了一个很绝的方法来杜绝0,n+1,直接给0,n+1性别赋值z

然后如果 前面的后面的加起来 == N+B 或者相减== N-B

再加上本地ide背锅(明明最后的答案是对的,但是编辑器不给过,就浪费了好久时间,后面无奈交了,发现对了。。无语)

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
#include<stack>
#include<list>
using namespace std;#define ll long long
#define lson pos<<1
#define rson (pos<<1)|1
#define father pos>>1
const int N = 2e6 + 7;struct person {char gender;int pos, pre, nxt, val; //一个人的位置,前驱,后继,舞蹈技术,性别
}a[N];struct heap {int margin, left, right;//差值
};bool operator < (heap a, heap b) {if (a.margin != b.margin) {return a.margin > b.margin;}return a.left > b.left;
}priority_queue<  heap > dance;bool flag[N];
char gender[N];
int skill[N];
int r[N], l[N];
int main() {int n;  cin >> n;for (int i = 1; i <= n; i++)cin >> gender[i];for (int i = 1; i <= n; i++)cin >> skill[i];//gender[n + 1] = 'q';//gender[0] = 'a';for (int i = 1; i <= n; i++) {a[i].pre = i - 1;a[i].nxt = i + 1;a[i].pos = i;a[i].val = skill[i];a[i].gender = gender[i];if (gender[i + 1] + gender[i] == 'B' + 'G' and i < n)dance.push(heap{ abs(skill[i] - skill[i + 1]), i, i + 1 });}int cnt = 0;while (!dance.empty()) {heap t = dance.top();dance.pop();if (flag[t.left] == 0 and flag[t.right] == 0) {cnt++;l[cnt] = t.left;r[cnt] = t.right;flag[t.left] = 1;flag[t.right] = 1;a[a[t.left].pre].nxt = a[t.right].nxt;a[a[t.right].nxt].pre = a[a[t.left].pre].pos;int pre = a[a[t.left].pre].pos;int nxt = a[a[t.right].nxt].pos;if ((int)(a[pre].gender + a[nxt].gender) == int('G' + 'B') and (flag[pre] == 0 and flag[nxt] == 0)) {int margin = abs(a[pre].val - a[nxt].val);dance.push(heap{ abs(margin), pre, nxt });}}}cout << cnt << endl;for (int i = 1; i <= cnt; i++) {cout << l[i] << ' ' << r[i] << endl;}
}//初始化堆:将“异性之间的舞蹈技术差值的绝对值、左边的人是谁、右边的人是谁” 插入堆中.
// 令一个heap变量  t = 堆顶, 那么t的left,right 就是需要出列的人的位置
// 然后用链表把这两个人连接起来
// 然后我们需要判断  t.left 的前面一个人(t.left .pre) .gender
// 和 
// t.right 的后面一个人 (t.right.nex).gender
// 是不是异性。 
// 如果是异性的话,我们就把这个信息插入到堆里面。
// 
//
/*8
BGBGBGBG
1 1 1 8 7 1 7 1
*/

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

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

相关文章

【WPF.NET开发】弱事件模式

本文内容 先决条件为什么要实现弱事件模式&#xff1f;应该由谁实现弱事件模式&#xff1f;如何实现弱事件模式 在应用程序中&#xff0c;附加到事件源的处理程序可能不会与将处理程序附加到源的侦听器对象一同销毁。 这种情况下会导致内存泄漏。 Windows Presentation Found…

DDoS 攻击并不是全部来自于PC组成的僵尸网络

DDoS&#xff0c;分布式拒绝服务攻击&#xff0c;是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。很多人会以为DDoS 攻击&#xff0c;全都是攻击者控制PC肉鸡发起的攻击…

ELF文件信息一览

准备开个专栏&#xff0c;记录《从零开始实现链接器》的学习过程&#xff0c;先占个坑。 之前一直想把自己的学习过程记录在个人博客网站上&#xff0c;但这个要自己维护&#xff0c;上传图片什么的比较麻烦。关键是没有人互动&#xff0c;自己也没有怎么去看&#xff0c;慢慢的…

柯桥专业会计学校之相关财税知识,2023年新版增值税税率表

一、增值税税率 一般纳税人增值税税率&#xff1a;13%&#xff0c;9%&#xff0c;6%&#xff0c;0%&#xff0c;都适用于哪些项目&#xff1f;我们具体来看&#xff1a;&#xff08;目前小规模纳税人3%征收率减按1%执行&#xff09; 二、扣除率 扣除率是指增值税计征中法定扣除…

什么是DDOS 攻击?常见的DDOS攻击有哪些?

什么是DDoS攻击&#xff1f; DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种旨在使计算机或网络资源不可用的恶意尝试。它通过使用多个受感染计算机&#xff08;称为僵尸网络&#xff09;同时向目标发送大量流量来实现这一目的&#xff0c;从而使目标不堪重负并崩溃…

【Bootstrap学习 day7】

Bootstrap按钮 按钮样式 使用.btn相关类实现 <button type"button" class"btn">基本按钮</button> <button type"button" class"btn btn-primary">主要按钮</button> <button type"button" cl…

【数据结构-单链表】(C语言版本)

今天分享的是数据结构有关单链表的操作和实践&#xff08;图解法&#xff0c;图变化更利于理解&#xff09; 记录宗旨&#x1f4dd;&#xff1a; 眼&#xff08;脑&#xff09;过千遍&#xff0c;不如手过一遍。 我们都知道单链表是一种常见的链表数据结构&#xff0c;由一系列…

【大数据】修复 Linux 错误 - 内存不足

修复 Linux 错误 - 内存不足 在使用 Linux 操作系统时,您可能会遇到内存不足的错误。这种错误通常会导致系统运行缓慢或崩溃。本文将介绍如何识别和修复 Linux 中的内存不足问题。 1. 检查内存使用情况 首先,您需要检查系统的内存使用情况。可以使用以下命令来查看当前内存…

【Java进阶篇】String中 intern 的原理是什么?

String中 intern 的原理 ✔️ 典型解析✔️小思考&#xff08;回顾&#xff09; ✔️字面量✔️intern✔️ intern原理✔️a和1有什么不同✔️答案 ✔️ 典型解析 字符串常量池中的常量有两种来源&#xff1a; 1、 字面量会在编译期先进入到Class常量池&#xff0c;然后再在运行…

配置ssh免密登录

1、cd ~ cd .ssh 输入ssh-keygen -t rsa 敲三次回车 [rootcdh-hadoop3 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase…

milvus学习(一)cosin距离和欧式距离

参考&#xff1a;https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化&#xff0c;未归一化的不可以相互转化&#xff08;因为距离带单位&#xff09;。

C++多态性——(2)联编

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 成功的秘诀就在于多努力一次&#xff…

自动化测试中,如何增加失败重试机制!

01、前言 在执行自动化测试用例时&#xff0c;会发现有时候用例失败并非代码问题&#xff0c;而是由于服务正在发版&#xff0c;导致请求失败&#xff0c;从而降低了自动化用例的稳定性&#xff0c;最后还要花时间定位到底是自身case的原因还是业务逻辑问题&#xff0c;还是其…

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

​随着市场竞争的加剧和企业规模的扩大&#xff0c;招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量&#xff0c;我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标&#xff0c;使得招标采购的质量更高、速度更快&#xff0c;…

宣传照(私密)勿转发

精美的海报通常都是由UI进行精心设计的&#xff0c;现在有100 件商品需要进行宣传推广&#xff0c;如果每个商品都出一张图显然是不合理的&#xff0c;且商品信息各异。因此需要通过代码的形式生成海报。对此&#xff0c;我也对我宣传一波&#xff0c;企图实现我一夜暴富的伟大…

贪心算法part04 860柠檬水找零 406根据身高重建队列

860 柠檬水找零 406 根据身高重建队列 452 用最少数量的箭引爆气球

使用java备份和恢复SQLServer表数据

需求 近来工作中遇到一个问题&#xff0c;内网办公系统中的数据需要导出到外网中进行查询&#xff0c;外网的数据库中还有一些表存储外网的数据&#xff0c;因此无法使用全库备份恢复功能来满足需求。即只从内网数据库中导出若干表的内容至外网数据库的对应表。 其他解决方案…

构建Python的Windows整合包教程

构建Python的Windows整合包教程 原文链接&#xff1a;https://blog.gcc.ac.cn/post/2023/buildpythonwindowsintegrationpackagetutorial/ 构建Python的Windows整合包教程 - 我的博客原文链接 前言 之前的开源项目本地素材搜索有很多人想要Windows整合包&#xff0c;因为Wi…

六、HTML 段落

HTML 可以将文档分割为若干段落。 一、HTML 段落 段落是通过 <p> 标签定义的。 <p>这是一个段落 </p> <p>这是另一个段落</p> 注意&#xff1a;浏览器会自动地在段落的前后添加空行。&#xff08;</p> 是块级元素&#xff09; 二、不…

[蓝桥杯知识学习] 树链

DFS序 什么是DFS序 怎么求DFS序 进入操作&#xff0c;将有计数 出&#xff1a;可以理解为&#xff0c;没有孩子可以去了&#xff08;不能&#xff0c;向下行动&#xff1a;对应于程序里的入栈&#xff09;&#xff0c;所以回到父结点&#xff08;向上行动&#xff0c;对应于程…