码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 6400

时间:2018-08-16 22:30:04      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:puts   tin   event   技术分享   pen   题意   枚举   技术   --   

题意是说在 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

 

HDU 6400

标签:puts   tin   event   技术分享   pen   题意   枚举   技术   --   

原文地址:https://www.cnblogs.com/Taskr212/p/9490290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!