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;
}
}

最新文章

  1. 【javascript激增的思考01】模块化编程
  2. ArcGIS学习记录—Arcgis中点、线、面的相互转换方法
  3. Linux下查看所有用户(shell脚本获取)
  4. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )
  5. [Windows Phone]解锁、注册Windows Phone实体手机为开发机(Windows 8)
  6. MellPlayer, 基于网易云歌单的命令行播放器
  7. P3092 [USACO13NOV]没有找零No Change
  8. SpringMVC和Struts2的比较
  9. web.xml 文件中一般包括 servlet, spring, filter, listenr的配置的加载顺序
  10. windows 下安装或者卸载memcache
  11. Myeclipse Db Browser使用
  12. robot framework之弹出窗口的处理关键字实战
  13. 获得ztree的所有子节点id
  14. Linux上的一些基本常用命令
  15. ACM基础(一)
  16. MyBatis打印输出SQL语句
  17. November 22nd 2016 Week 48th Tuesday
  18. GO_01:Linux-CentOS之Go语言环境配置
  19. TextBoxes 与 TextBoxes ++
  20. 浅谈jsonp

热门文章

  1. 接上篇:Git Worktree 高级使用,这样清爽多了
  2. 基于Ubuntu 18.04.5 LTS 部署Ceph集群测试及Ceph RDB的使用。
  3. 【2020五校联考NOIP #8】自闭
  4. Linux系统编程之命名管道与共享内存
  5. 毕业设计之zabbix集合
  6. memset初始化值的效率秒杀for循环
  7. Webpack 打包 Javascript 详细介绍
  8. 23. 关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
  9. Java读文件写入kafka
  10. 【STM32】基于正点原子『探索者』开发板的烧录