CF513B1 Permutations 题解
2024-09-08 21:11:03
Content
给定两个整数 \(n,m\)。定义 \(f(p)=\sum\limits_{l=1}^n\sum\limits_{r=l}^n\min\limits_{i=l}^rp_i\),其中 \(p\) 为一个长度为 \(n\) 的排列。现在,请你求出所有使得 \(f(p)\) 最大的长度为 \(n\) 的排列中,字典序第 \(m\) 小的排列。
数据范围:\(1\leqslant n\leqslant 8\)。
Solution
看到数据范围马上想到一种很 naive 的 \(O(n!\cdot n^3)\) 的做法:先枚举所有的排列求出最大的 \(f(p)\),然后再枚举所有的排列扫到使得 \(f(p)\) 最大的字典序第 \(m\) 小的排列。
next_permutation
可以更方便地枚举全排列,具体看代码。
Code
namespace Solution {
const int N = 17;
int n, m, mx, p[N];
iv Main() {
read(n, m); F(int, i, 1, n) p[i] = i;
do {
int sum = 0;
F(int, l, 1, n) F(int, r, l, n) {
int mn = 10;
F(int, i, l, r) mn = min(mn, p[i]);
sum += mn;
}
mx = max(mx, sum);
}while(next_permutation(p + 1, p + n + 1));
int cnt = 0;
F(int, i, 1, n) p[i] = i;
do {
int sum = 0;
F(int, l, 1, n) F(int, r, l, n) {
int mn = 10;
F(int, i, l, r) mn = min(mn, p[i]);
sum += mn;
}
if(sum == mx) {
cnt++;
if(cnt == m) {
F(int, i, 1, n) printf("%d%c", p[i], " \n"[i == n]);
break;
}
}
}while(next_permutation(p + 1, p + n + 1));
return;
}
}
最新文章
- 【javascript激增的思考01】模块化编程
- ArcGIS学习记录—Arcgis中点、线、面的相互转换方法
- Linux下查看所有用户(shell脚本获取)
- BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
- [Windows Phone]解锁、注册Windows Phone实体手机为开发机(Windows 8)
- MellPlayer, 基于网易云歌单的命令行播放器
- P3092 [USACO13NOV]没有找零No Change
- SpringMVC和Struts2的比较
- web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序
- windows 下安装或者卸载memcache
- Myeclipse Db Browser使用
- robot framework之弹出窗口的处理关键字实战
- 获得ztree的所有子节点id
- Linux上的一些基本常用命令
- ACM基础(一)
- MyBatis打印输出SQL语句
- November 22nd 2016 Week 48th Tuesday
- GO_01:Linux-CentOS之Go语言环境配置
- TextBoxes 与 TextBoxes ++
- 浅谈jsonp
热门文章
- 接上篇:Git Worktree 高级使用,这样清爽多了
- 基于Ubuntu 18.04.5 LTS 部署Ceph集群测试及Ceph RDB的使用。
- 【2020五校联考NOIP #8】自闭
- Linux系统编程之命名管道与共享内存
- 毕业设计之zabbix集合
- memset初始化值的效率秒杀for循环
- Webpack 打包 Javascript 详细介绍
- 23. 关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
- Java读文件写入kafka
- 【STM32】基于正点原子『探索者』开发板的烧录