【noip模拟题】华尔街的秘密

Description

  最近美国人致力于掀翻华尔街的资本家们,因为他们的生活并不太好,可是那些资本家却依然过着奢华的享乐生活。一些人在游行,而另一些人则试图揭开华尔街的金融家们获取财富的秘密,终于,白宫发现了这个秘密,那就是——一个括号矩阵!!!
  所谓括号矩阵,就是一个n*m的矩阵,其中的每一个元素要么是’(‘,要么是’)’。矩阵中有公共边的格子是相邻的。从矩阵的左上角(1,1)到右下角(n,m)的一条路径,如果满足下一步要么走到右边相邻的格子,要么走到下边相邻的格子,它就是一条最短路径。一条路径是合法的,当且仅当它形成的括号序列是可以匹配的,例如(())()、()、(()(()))等等都是可匹配的,而)(、(()、(()))(等等是不可匹配的。一个括号矩阵合法,当且仅当其所有的最短路径合法。
  现在,我们定义两个大小相等的合法括号矩阵a和b的比较。c数组是和括号矩阵大小相等的矩阵,规模也是n*m,其中的元素是1~n*m间整数,且互不相同,即n*m个整数出现且仅出现了一次。找到满足如下条件的i,j,a[i][j]≠b[i][j],且c[i][j]最小。若a[i][j]=’(‘,则a < b,否则a > b。
  现在奥巴马已经得知某个括号矩阵里面藏着金融家们的致富密码,他会告诉你三个整数n,m,k,你需要找出第k小的n*m的矩阵,这就是那个秘密矩阵。

Input

  输入第一行有三个整数,n,m,k。
  接下来有n行,每行m个数,第i行第j个数表示c[i][j]。

Output

  输出一个n*m的矩阵,由‘(’和‘)’组成。

Sample Input

1 2 1
1 2

Sample Output

()
Hint
n,m<=100, k<=10^18
1<=c[i][j]<=n*m,c中所有元素保证不同
保证存在答案矩阵

Source

刘峻琳


首先感谢刘峻琳学长留下的这道题目。
还有,题目样例太水,这里提供一组加强版(大大的方便了解题)

input

7 10 1
14 29 33 8 1 70 49 62 54 44
46 12 20 2 61 26 56 69 48 31
16 13 3 65 27 59 68 10 40 18
15 4 53 25 47 42 36 17 37 34
5 64 38 55 45 60 30 35 6 22
66 32 67 50 51 9 57 19 21 11
39 52 43 58 23 7 63 24 28 41

output

()((()()))
)((()()))(
((()()))((
(()()))(((
()()))((()
)()))((())
()))((()))

题目大概就是这个样子了。
我们读一读题,发现是让我们输出一个以c[][]数组为映射(或者这样理解,就是说按照c数组的大小进行比较)的第KKK大的合法矩阵。
那么什么是合法的矩阵呢?题目中说道,就是从左上角只能够向右或者向下走到右下角的所有路径都是合法的括号序列。
怎么做呢?
我们得出一个惊人的事实:所有的路径都是同一个括号序列

我们试图从样例来解释一番
()((()()))
 " role="presentation" style="position: relative;">  \ )((()()))(
  \ \ ((()()))((
   \ \ \ (()()))(((
\quad ()()))((()
 \quad \ )()))((())
  \quad \ \ ()))((()))

是不是竖着的一样呢?
或者说,从右上到左下的对角线都是一样的。
所以我们只需要找出第KKK大的长度为n+m−1" role="presentation" style="position: relative;">n+m−1n+m−1n+m-1括号序列即可。
注意,这里的比较方式不是从左往右,而是按照C数组的顺序。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline static int read() {char c; int rec=0;while((c=getchar())<'0'||c>'9');while(c>='0'&&c<='9') rec=rec*10+c-'0',c=getchar();return rec;
}
int n,m; long long K;
int c[105][105],Rank[10005],vis[205];
int code[205],order[205];
bool overflow[205][205];
//括号序列的总数是超过long long范围的,但是K是在long long范围之内的。
long long f[205][205];
inline void Dp() {memset(f,0,sizeof(f));memset(overflow,0,sizeof(overflow));f[0][0]=1;for(int i=0;i<n+m-1;i++)for(int j=0;j<=i;j++){if(code[i+1]!=-1) {f[i+1][j+1]+=f[i][j];if(f[i+1][j+1]<0||overflow[i][j]) overflow[i+1][j+1]=1;//所以说,只要f[][]的大小超过了long long,那么显然超过了K}if(code[i+1]!=1&&j>0) {f[i+1][j-1]+=f[i][j];if(f[i+1][j-1]<0||overflow[i][j]) overflow[i+1][j-1]=1;}}return ;
}//在当前已选的部分括号序列的情况下,可能的括号序列的个数
int main() {n=read(); m=read(); cin>>K;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j) {c[i][j]=read();Rank[c[i][j]]=i+j-1;}//Rank是当前位置在括号序列中对应的排名int tot=0;for(int i=1;i<=n*m;++i)if(vis[Rank[i]]==0) {order[++tot]=Rank[i];vis[Rank[i]]=1;if(tot==n+m-1) break;}//得到比较括号序列大小的顺序for(int i=1;i<n+m;++i) {int p=order[i];code[p]=1;Dp();if(f[n+m-1][0]>=K||overflow[n+m-1][0]) continue;code[p]=-1;K-=f[n+m-1][0];}for(int i=1;i<=n;++i) {for(int j=1;j<=m;++j)code[i+j-1]==1?putchar('('):putchar(')');puts("");}//根据括号序列输出合法矩阵return 0;
}

【noip模拟题】华尔街的秘密相关推荐

  1. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  2. NOIp模拟题 之 肮脏的牧师 (桶排序)

    闲话: 考场上看到了这一题,简直令我震惊!啊!居然还有真么简单的模拟题!良心啊! 而且,还是我 痴迷的 熟悉的游戏 --  欧气传说 炉石传说! (话说题面的那三张卡都贼 恶心 好用!都可以在前期打出 ...

  3. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 12  Solved: 9 [Submit][Status][Web Bo ...

  4. 【noip模拟题】天神下凡(贪心)

    vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...

  5. NOIP模拟题——来自风平浪静的明天

    [题目描述] 冬眠了五年,光终于从梦中醒来. 千咲.要,大家都在. 隐约记得"昨天"的海船祭,爱花意外成为贡女,沉入海底. 海面冰封,却有丝丝暖流在冰面之下涌动. 此时,爱花沉睡在 ...

  6. Noip模拟题解题报告

    Pro 第一次AK. 题目链接 Sol 站军姿 算是数学题吧,求出两圆的位置关系,然后余弦定理和扇形面积什么的搞搞就行. #include<iostream> #include<cs ...

  7. NOIP模拟题 通讯 强连通分量缩点 最小树形图--朱刘算法

    通讯 (message.cpp\c\pas) [问题描述] "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短信,并由此得知了伦 ...

  8. noip模拟题11.5

    T1 大天使之剑 [问题描述] 小A在游戏⾥打怪.有⼀次,他⼀下⼦遇到了n个怪物. 每个怪物有一个生命值,第i个怪物的生命值是h_i.而小A除了生命值之外,还有一个属性是魔法值m. 小A和怪物们依次行 ...

  9. noip模拟题11.11 光棍节测试

    T1. tractor 题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1. ...

  10. [Noip模拟题]寿司

    Description 小 c 是一名 oier.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间 AC.为此,他被狠狠地嘲讽了一番.于是, ...

最新文章

  1. python下载保存_下载并保存图片Python2.7
  2. 深度学习——用softmax函数来规范可变参数
  3. 2345浏览器网址导航_2345导航,曾被网民吐槽劫持浏览器主页
  4. sanic set up
  5. 软件开发应用分层、每层的作用及各层之间调用关系
  6. 自己整理的90分以上最新物联网技术导论期末选择填空大题总考点
  7. Windows自建虚拟机搭建kms激活服务器激活正版系统教程
  8. 美丽杭州,魅力杭州:弘阳地产水城新时代
  9. java html 导出 pdf文件,Java HTML导出PDF (一)
  10. Gluster (一)安装
  11. 深度学习的loss变小梯度是否变小
  12. leetcode【中等】838、推多米诺
  13. 通过session实现用户的登录与登出功能
  14. -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
  15. 韩顺平mysql_韩顺平老师 Mysql优化 笔记
  16. 基础实验——三轴传感器
  17. abi:用json解析和对比linux平台下elf文件
  18. 获取现在的Unix时间戳(Unix timestamp)的方法-在线时间戳转换器
  19. Java——Map集合
  20. 汇编语言实现两个多位十进制数相减实验

热门文章

  1. JS请求服务器gbk文件乱码问题
  2. 【防火墙_动态路由-OSPF】
  3. log4jjavasciprt弹窗拦截
  4. iOS中调用短信和邮箱的方法
  5. 计算机怎么硬盘重做系统,如何对新的硬盘安装系统进行分区并重新安装系统计算机分区教程...
  6. Python通过哈希算法实现文件完整性校验-以及大型文件完整性校验
  7. 农业知识图谱(Agriculture_KnowledgeGraph)项目环境构建
  8. js 万年历农历转阳历 方法_JS简单获取当前日期和农历日期的方法
  9. 浅谈青年在选择职业时的考虑
  10. umount卸载磁盘提示target is busy. (目标忙) 的问题解决方案