题意是说在 h 行 w 列的矩阵中,通过设计使得尽可能多的行或列能满足题中的平衡条件。

如果行数(列数)是奇数,那么每一列(行)一定不能平衡,就要按照满足每一行(列)平衡,输出“ () “;若行数和列数同时是奇数,则设计不出任何一行或一列平衡;

当行数和列数同时为偶数时,情况是最复杂的,开始的时候只是想到两个数字谁大就去满足谁的平衡,结果完全不对,因为不只是“ ()()() ”是平衡的,像“ ((())) ”这种也是平衡的。也就是说在行满足平衡条件的同时列也可能满足平衡条件,比如:

" (((( " 就在满足每一列平衡的同时多满足了一行,然后......然后我智商就不够了。看了别人的博客才知道,可以通过“牺牲”掉最外面的一圈,也就是两行和两列,其他各行各列就都能平衡,也就是都能达到 ans = h + w - 4 ;但是在行数和列数的最小值小于 4 的时候,这种

()()     “牺牲”的做法并不是最优的,此时通过暴力的方法去枚举找到(2,2),(2,4),(4,2),(4,4)的图案即可。

)()(    这种做法是怎么想出来的呢?请移步去大佬的博客吧.......

))))

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 int main()
  4 {
  5     int t,a,b;
  6     scanf("%d",&t);
  7     while(t--)
  8     {
  9         scanf("%d%d",&a,&b);
 10         if((a&1)&&(b&1))
 11         {
 12             for(int i = 0; i < a; i++)
 13             {
 14                 for(int j = 0; j < b; j++)
 15                     printf("(");
 16                 printf("\n");
 17             }
 18         }
 19         else if((a&1)&&!(b&1))
 20         {
 21             for(int i = 0; i < a; i++)
 22             {
 23                 for(int j = 0; j < b; j++)
 24                     if(j&1) printf(")");
 25                     else printf("(");
 26                 printf("\n");
 27             }
 28         }
 29         else if(!(a&1)&&(b&1))
 30         {
 31             for(int i = 0; i < a; i++)
 32             {
 33                 for(int j = 0; j < b; j++)
 34                     if(i&1) printf(")");
 35                     else printf("(");
 36                 printf("\n");
 37             }
 38         }
 39         else
 40         {
 41 /*            if(a > b)
 42             {
 43                 for(int i = 0; i < a; i++)
 44                 {
 45                     for(int j = 0; j < b; j++)
 46                         if(j&1) printf(")");
 47                         else printf("(");
 48                     printf("\n");
 49                 }
 50             }
 51             else
 52             {
 53                 for(int i = 0; i < a; i++)
 54                 {
 55                     for(int j = 0; j < b; j++)
 56                         if(i&1) printf(")");
 57                         else printf("(");
 58                     printf("\n");
 59                 }
 60             }
 61 */
 62             if(a==2 && b==2)
 63             {
 64                 puts("()");
 65                 puts(")(");
 66                 continue;
 67             }
 68             if(b==2)
 69             {
 70                 for(int i = 0; i < a; i++)
 71                     puts("()");
 72                 continue;
 73             }
 74             if(a==2)
 75             {
 76                 for(int i = 0; i < b; i++)
 77                     printf("(");
 78                 printf("\n");
 79                 for(int i = 0; i < b; i++)
 80                     printf(")");
 81                 printf("\n");
 82                 continue;
 83             }
 84             if(a==4)
 85             {
 86                 for(int i = 0; i < b; i++)
 87                     printf("(");
 88                 printf("\n");
 89                 for(int i = 0; i < b; i++)
 90                 {
 91                     if(i < b/2)printf(")");
 92                     else printf("(");
 93                 }
 94                 printf("\n");
 95                 for(int i = 0; i < b; i++)
 96                 {
 97                     if(i < b/2)printf("(");
 98                     else printf(")");
 99                 }
100                 printf("\n");
101                 for(int i = 0; i < b; i++)
102                     printf(")");
103                 printf("\n");
104                 continue;
105             }
106             if(b==4)
107             {
108                 for(int i = 0; i < a; i++)
109                 {
110                     if(i < a/2) puts("()()");
111                     else puts("(())");
112                 }
113                 continue;
114             }
115             for(int i = 0; i < a; i++)
116             {
117                 for(int j = 0; j < b; j++)
118                 {
119                     if(i == 0|| j == 0) printf("(");
120                     else if(i == a-1 || j == b-1) printf(")");
121                     else
122                     {
123                         if(j == 0) printf("(");
124                         else if(j == b-1) printf(")");
125                         else
126                         {
127                             if(!(i&1))
128                                 if(j&1) printf("(");
129                                 else printf(")");
130                             else
131                                 if(j&1) printf(")");
132                                 else printf("(");
133                         }
134                     }
135                 }
136                 printf("\n");
137             }
138         }
139     }
140     return 0;
141 }

View Code

转载于:https://www.cnblogs.com/Taskr212/p/9490290.html

HDU 6400(括号组合 ~)相关推荐

  1. python编程括号怎么打_在python中打印有效的括号组合

    我试图用我自己的直觉打印python中所有有效的括号组合.它几乎可以工作,但只是它不打印几个组合.代码是这样的solution = "" def parentheses(n): g ...

  2. hdu 6400 Parentheses Matrix思维

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6400 这题有坑.. hw的最小值小于等于4是一种情况,否则是另外一种情况. 第一种情况可以 ((((( ...

  3. 输出所有的合法的括号组合

    Implement an algorithm to print all valid (e. g. , properly opened and closed) combinations of n-pai ...

  4. java实现所有括号组合的遍历_括号正确嵌套问题的实现(Java)

    最近比较忙,前几天实现的一些小算法没时间写到博客上面,今天有时间了,把它整理出来,跟大家分享. 废话少说,进入正题. 题目描述:给定一字符串,其内包含"()","{}&q ...

  5. hdu 4489(排列组合+DP)

    有N个高矮不同的人,求高矮高矮高矮高矮......或者矮高矮高矮高......的排列方法一共有多少种. 假设第N个插入到队伍中的人比前N-1个人都要高,假设他插入的位置为 j ,那么j-1要比j-2矮 ...

  6. hdu 6400 Parentheses Matrix

    题目:点击打开链接 题意: 给一个只含'('和')'的矩阵,只考虑从行和列上的括号序列,构造一个矩阵使得合法括号序列的总数最多. 分析:构造,分类讨论.首先奇数行或奇数列内是不存在合法括号序列的,所以 ...

  7. HDU 6400 Parentheses Matrix(构造)

    题意:给你r,c求一个矩阵让它的行和列的匹配度最大,匹配就要一行一列全都匹配 每个位置只能是左括号或者右括号, "()"这算一个匹配,那么"(())",&quo ...

  8. hdu 1521 排列组合 多重集排列 + 指数生成函数

    传送门 文章目录 题意: 思路: 题意: 思路: 显然是多重集排列数,我们考虑构造指数生成函数,让后模拟一下多项式乘法即可啦. 由于存在分数,所以直接用doubledoubledouble即可. // ...

  9. LeetCode22——Generate Parentheses(给定n对括号,然后看有多少正确的括号组合)

    题目: 解法: The idea is intuitive. Use two integers to count the remaining left parenthesis (n) and the ...

最新文章

  1. DIV+CSS规范命名大全集合
  2. PL/SQL编程:用for循环算出5的阶乘
  3. 2021首期Nature封面:牛津大学ML算法实现10万高压非晶硅原子的模拟​ | AI日报
  4. 浅析网站流量出现异常情况应怎样解决?
  5. 从清明节到儿童节,打造一个童话城市
  6. 程序员面试题精选100题(22)-整数二进制表示中1的个数[算法]
  7. python词云代码简单_Python 简单实现标签词云
  8. Springboot对web应用的统一异常处理
  9. 菜鸟ING的博客终于开园了。
  10. android第三方launcher,目前Android平台最好的Launcher
  11. 【Golang 快速入门】高级语法:反射 + 并发
  12. Android开源库集合(UI效果)
  13. 巧妙的实现 CSS 斜线
  14. 65. magent 手动创建用户
  15. HTML5 css3 阴影效果
  16. GB35114视频流处理
  17. 全面的结构专业英语词汇 (三)
  18. Android EditText去掉下划线
  19. 冬奥、亚运会、世界杯,顶级运动员与头部品牌们的营销盛宴
  20. CSDN20181218博客黑板报

热门文章

  1. 阿里云9月1日安骑士升级故障真相
  2. 基于java电动车实名挂牌系统(java毕业设计)
  3. MS Office 2007 Project 安装方法
  4. 高压滑环与低压滑环的技术区别有哪些
  5. 购物打折C语言程序设计,算法提高 促销购物(动态规划+完全背包)-----------------C语言——菜鸟级...
  6. 学习使用XMind——绘制计算机网络概述的思维导图
  7. li指令 汇编_RISC-V平台的汇编指令解析
  8. 常用实验报告LaTex 模板
  9. 华为刷机-回退版本升级
  10. 如何给你的社群定位?