题意:给你r,c求一个矩阵让它的行和列的匹配度最大,匹配就要一行一列全都匹配
每个位置只能是左括号或者右括号, “()”这算一个匹配,那么“(())”,“()()”也是匹配的。
题解:当r,c都为奇数时,不可能匹配;
当r或c为奇数时,答案就是r,c
难的是r和c都是偶数,遇事不决先打表。
想一想,第一行要匹配要一半的左括号,一般的右括号,(((()))),像这样,第一行有右括号该列就无法匹配了
就很浪费,那么第一行就全是(((((((((,同理第一列也全都是((((((((,然后吧,最后一列是))))))
最后一行除了第一列都是))))))))))))))
然后就是中间的,打表或者自己画找找规律什么的,发现行或者列有一个小于等于4第一行有(()),就不会很浪费
就算特殊情况,然后构造。
比如4 16
((((((((((((((((
))))))))((((((((
(((((((())))))))
))))))))))))))))
这样排列就多赚了第三行,但是往后如果行列没有小于4的,就还是按照上面的处理
比如这个最多是16,(比赛真是服了一群14wa,14wa,14wa,然后最后几分钟浙大宁波学院的一哥们?说是16我还没信,emmmmm)
10 10
((((((((((
()()()()()
(()()()())
()()()()()
(()()()())
()()()()()
(()()()())
()()()()()
(()()()())
()))))))))
#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int r,c;scanf("%d %d",&r,&c);if((r&1)&&(c&1))//都是奇数随便输出 {for(int i=0;i<r;i++)for(int j=0;j<c;j++){printf("(");if(j==c-1)printf("\n");}}else if((r&1))//行为奇数,答案为行数 {for(int i=0;i<r;i++)for(int j=1;j<=c/2;j++){printf("()");if(j==c/2)printf("\n");}}else if((c&1)){for(int i=1;i<=r;i++)for(int j=0;j<c;j++){if((i&1)){printf("(");}else printf(")");if(j==c-1)printf("\n");}}else {int p=min(r,c),q=max(r,c);if(p<=4) {if(r<c)//r<c有小于4的 {for(int i=1;i<=r;i++)for(int j=1;j<=c;j++){if(i==1)printf("(");else if(i==r)printf(")");else {if((i&1)){if(j<=c/2)printf("(");else printf(")");}else {if(j<=c/2)printf(")");else printf("(");}}if(j==c)printf("\n");} }else//c>=r r小于等于4 {for(int i=1;i<=r;i++)for(int j=1;j<=c;j++){if(i<=r/2){if(j<=c/2)printf("(");else printf(")");if(j==c)printf("\n");}else {if((j&1))printf("(");else printf(")");if(j==c)printf("\n");}}}}else//都为偶数没有小于4的 {for(int i=0;i<r;i++)for(int j=0;j<c;j++){if(i==0||j==0)printf("(");else if(i==r-1||j==c-1)printf(")");else if(((i+j)&1))printf("(");else printf(")");if(j==c-1)printf("\n");}} }}return 0;
}