input

4
2 9 7
1 9 10
2 8 4
1 7 9

output

34

博主是一个菜鸟,期望各位大佬能进行指点。
读完题目之后,我们不妨来回顾一下高中的排列组合之插空法与捆绑法。
捆绑法
使用方式:将相邻元素捆绑在一起,看成一个整体。
插空法
使用方式:先安排除了不相邻以外的其它元素,再将不相邻元素插空。
思路:
步骤一:
对每一种性格进行捆绑和分组:
情况1.在没有pi<qi的情况下,把所有同种性格的同学捆绑在一起,并把min(pi-qi)对应的同学移动到最左边,并加入A组。
情况2.在有pi<qi的情况下,把符合(pi<qi)的同学捆绑在一起,并把在pi<qi下的max(qi)对应的同学移动到捆绑同学的最左边,然后把捆绑的同学和未捆绑的同学组成一个Bi组,然后加入B组。
完成步骤一,可以得到一组在同一性格下的数据:
1.只有一个数据。
2.多个数据,并且每个数据的pi<qi。
步骤二:
进行插空或插空加捆绑:
不妨设:
B.size=B0.size+B1.size+…+Bn-1.size,
maxsize=max(Bi.size),
B_size=(B.size-maxsize),
A.size。
情况1:maxsize-1<=B_size+A.size
结果很显然同种性格的数据必定不相邻。
情况2:maxsize-1>B_size+A.size
不妨设maxsize对应得的Bi为Bm组,因此Bm组内会有Q=maxsize-B_size-A.size个数据要进行捆绑。对Bm组关于min(qi-pi)进行升排序,取前Q个数据进行捆绑,并把第1个放在捆绑的最左边,接下来参考情况1。

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
struct node {int kind;int p, n;node(int kind,int p,int n):kind(kind),p(p),n(n){}node(){}
};
bool cmp(node A, node B) {return A.n < B.n;
}
bool cmp1(vector<node> A, vector<node> B) {return A.size() > B.size();
}
bool cmp2(node A, node B) {return A.n - A.p < B.n - B.p;
}
int main() {int n, kind, po, ne, ne_ans_num = 0;unordered_map<int, vector<node>>datas;vector<vector<node>>ne_ans;vector<node>ans;cin >> n;for (int i = 0; i < n; i++) {cin >> kind >> po >> ne;if (!datas.count(kind)) {vector<node> temp;datas[kind] = temp;}datas[kind].push_back(node(kind, po, ne));}for (auto temp : datas) {int min = 2000;node p(temp.first, 0, 0);vector<node>n_big;for (auto data : temp.second) {if (data.p >= data.n) {min = min > data.p - data.n ? data.p - data.n : min;p.p += data.p;}else {n_big.push_back(data);}}if (n_big.size() > 0) {sort(n_big.begin(), n_big.end(), cmp);p.n = p.p + n_big[n_big.size() - 1].n;p.p += n_big[n_big.size() - 1].p;n_big.pop_back();n_big.push_back(p);ne_ans.push_back(n_big);ne_ans_num += n_big.size();}else {p.n = p.p - min;ans.push_back(p);}}sort(ne_ans.begin(), ne_ans.end(), cmp1);ne_ans_num -= ne_ans[0].size();if (ne_ans[0].size() - 1 <= ne_ans_num + ans.size()) {int max = 0;for (auto temp : ne_ans) {for (auto p : temp) {max += p.n;}}for (auto temp : ans) {max += temp.n;}cout << max;}else {int max = 0;sort(ne_ans[0].begin(), ne_ans[0].end(), cmp2);int temp_size = ne_ans[0].size() - 1 - (ne_ans_num + ans.size());for (int i = 0; i < ne_ans[0].size(); i++) {if (i < temp_size)max += ne_ans[0][i].p;else max += ne_ans[0][i].n;}for (int i = 1; i < ne_ans.size(); i++) {for (auto temp : ne_ans[i])max += temp.n;}for (auto temp : ans) {max += temp.n;}cout << max;}return 0;
}

排队队---排列组合之插空法与捆绑法相关推荐

  1. 排列组合 【插空法】【捆绑法】【容斥原理】

  2. [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  3. P3223 [HNOI2012]排队(高中排列组合)

    传送门 题意 nnn个男生,mmm个女生,222个老师排队 女生和女生不能相邻,老师和老师不能相邻,问方案数. 考虑到老师只有两个,所以可以对老师来讨论. Ⅰ.\color{Red}Ⅰ.Ⅰ.两只老师间 ...

  4. 排列组合简介以及相关问题

    排列组合问题 高中学过的知识,太久没用过了现在记录一下 排列组合问题 排列组合问题 初步了解:加法原理和乘法原理 排列组合 初识排列 定义 计算公式 初识组合 定义 公式 排列组合的三种技巧方法 1) ...

  5. 排列组合问题之捆绑法和插空法

    捆绑法和插空法是解排列组合问题的重要方法之一,主要用于解决"相邻问题"及"不邻问题".总的解题原则是"相邻问题捆绑法,不邻问题插空法".在实 ...

  6. E 排队(排列组合)[牛客小*白月赛61]

    题面如下: 思路 or 题解: 对于一个长度为 nnn 的 排列组合 如果存在一对 逆序对 (x,y)(x, y)(x,y) xxx 在 yyy 的前面有 n∗(n−1)2\frac{n * (n - ...

  7. 概率 插空法和捆绑法

    一.基础理论: 捆绑法:遇到有"相邻元素"的问题,先把规定的相邻元素捆绑在一起参与排列,当需要考虑元素的相对顺序时,再进行松绑. 题干中常见的词语如: 相邻站位.相连.连续等. 插 ...

  8. 组合数学(排列组合,容斥原理,数论定理)

    组合数学的学习 排列组合 一.排列组合基础 二.排列组合练习题 容斥原理 定理学习 例题练习 例题1: [ 1 , n ] [1,n] [1,n] 中有多少个数能被 x 或 y 整除 例题2: [ 1 ...

  9. c语言中叹号 几个字节,排列组合里的惊叹号和A和C、P等符号都是什 – 手机爱问...

    2007-01-24 排列组合排列组合应如何学习 排列组合 热★★★ [字体:小 大] 排列组合 作者:佚名文章来源:本站原创点击数:更新时间:2004-3-19 [重点和难点分析] 一.排列组合部分 ...

最新文章

  1. python入门爬虫知识点
  2. 从限流削峰到性能优化,谈1号店抽奖系统架构实践
  3. altium 去掉部分铺铜_干货|HFSS器件导入Altium进行PCB制作教程!!!
  4. jboss4 迁移_应用程序服务器迁移:从JBoss EE5到Wildfly EE7
  5. guava缓存数据到本地_扩展Guava缓存以溢出到磁盘
  6. yolov4Linux,基于Darknet的YOLOv4目标检测
  7. java smack 例子_java+smack+openfire即时通讯Im(四)
  8. (转载) Java线程池原理
  9. 转载JNI(Windows)
  10. jQuery表格排序(tablesorter)
  11. OpenCV自然场景文本检测(附Python代码)
  12. 在Linux环境下安装JDK+JBoss
  13. 如何书写IT行业的个人简历
  14. HCNE实验操作视频   迅雷下载
  15. umi 约定式路由 关于 history.goBack() 的奇奇怪怪问题
  16. 电脑开不了机的原因和解决办法
  17. 红米k40和红米k40pro的区别 哪个好
  18. 备库ORA-00313 ORA-00312 ORA-27037
  19. 摘录《事实》汉斯·罗斯林
  20. mysql case when 优化_SQL 逻辑优化 case when 转为 union all

热门文章

  1. Ubuntu16.04LTS上安装QQ,QQ音乐
  2. 逆水寒服务器维护公告,《逆水寒》2018年11月29日更新公告
  3. 【控制篇 / 应用】(6.0) ❀ 01. 只允许使用 QQ 和微信 (上) ❀ FortiGate 防火墙
  4. 噩梦射手(SurvivalShooter)教程(十一)
  5. Androd studio + MUMU模拟器
  6. (java毕业设计)基于java教室设备管理系统源码
  7. html 语言怎么弄英语,HTML语言,HTML language,音标,读音,翻译,英文例句,英语词典
  8. linux. qt信号崩溃,【创龙AM4379 Cortex-A9试用体验】之I/O中断异步通知驱动程序+QT捕获Linux系统信号+测试信号通知...
  9. 08蚂蚁-互联网安全架构——1.XSS攻击,SQL注入攻击,Http请求防盗链,CSRF请求攻击,忘记密码暴力破解,上传文件漏洞
  10. mac win7 计算机,苹果电脑win7单系统更换OS X系统