2018 Multi-University Training Contest 8 1004 Parentheses Matrix(hdu 6400)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz467796454/article/details/81707786

题目链接:hdu 6400 Parentheses Matrix

Sample Input
3
1 1
2 2
2 3
 

Sample Output
(
()
)(
(((
)))

 题意:n*m的矩阵,由'('或')'组成,空字符串为平衡,若A平衡,则(A)也平衡,若A和B平衡,则AB平衡,输出平衡的行和平衡的列之和最大的情况。

思路:首先明确奇数的情况下,不可能是平衡的,所以当n和m都为奇数,平衡数为0,随意输出即可,当n和m中有一个是奇数的情况下,平衡数最大为n和m中为奇数的数,输出方式很简单就不说了。当n和m都为偶数的情况下,以n>=m为例,我考虑的是满足所有n的情况下(图一),保证每一行都满足平衡数的前提下,尽可能增加列中的平衡数(图二),这样我们得到的平衡数就是n+(m-2)/2,(m为2的情况特判),但是这样是错的,还有更优解。我们以破坏第一行和最后一行的平衡为代价,使得除去第一列和最后一列的列都保持平衡(图三),这样我们得到的平衡数就变成了n+m-4。比较这两种情况的大小,解得当m>=6的时候图三做法比图二更优。

图一
图二
图三
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#define maxn 2000006
using namespace std;
typedef long long ll;
const ll mod=1e9+7;

int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		if((n%2==1)&&(m%2==1)){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					if(j%2==1)printf("(");
					else printf(")");
				}
				printf("\n");
			}
		}
		else if(n%2==1){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					if(j%2==1)printf("(");
					else printf(")");
				}
				printf("\n");
			}
		}
		else if(m%2==1){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=m;j++){
					if(i%2==1)printf("(");
					else printf(")");
				}
				printf("\n");
			}
		}
		else{
			if(n==2){
				for(int i=1;i<=n;i++){
					for(int j=1;j<=m;j++){
						if(i==1)printf("(");
						else printf(")");
					}
					printf("\n");
				}
			}
			else if(m==2){
				for(int i=1;i<=n;i++){
					for(int j=1;j<=m;j++){
						if(j==1)printf("(");
						else printf(")");
					}
					printf("\n");
				}
			}
			else if(n>=m){
				if(m!=4){
					for(int i=1;i<=n;i++){
						for(int j=1;j<=m;j++){
							if(i==1)printf("(");
							else if(i==n)printf(")");
							else if(j==1)printf("(");
							else if(j==m)printf(")");
							else if((j-1)%2==1){
								if(i%2==1)printf("(");
								else printf(")");
							}
							else{
								if(i%2==1)printf(")");
								else printf("(");
							}
						}
						printf("\n");
					}
				}
				else{
					for(int i=1;i<=n;i++){
						for(int j=1;j<=m;j++){
							if(j==1)printf("(");
							else if(j==m)printf(")");
							else if((j-1)%2==1){
								if(i%2==1)printf("(");
								else printf(")");
							}
							else{
								if(i%2==1)printf(")");
								else printf("(");
							}
						}
						printf("\n");
					}	
				}
			}
			else{
				if(n!=4){
					for(int i=1;i<=n;i++){
						for(int j=1;j<=m;j++){
							if(j==1)printf("(");
							else if(j==m)printf(")");
							else if(i==1)printf("(");
							else if(i==n)printf(")");
							else if((i-1)%2==1){
								if(j%2==1)printf("(");
								else printf(")");
							}
							else{
								if(j%2==1)printf(")");
								else printf("(");
							}
						}
						printf("\n");
					}
				}
				else{
					for(int i=1;i<=n;i++){
						for(int j=1;j<=m;j++){
							if(i==1)printf("(");
							else if(i==n)printf(")");
							else if((i-1)%2==1){
								if(j%2==1)printf("(");
								else printf(")");
							}
							else{
								if(j%2==1)printf(")");
								else printf("(");
							}
						}
						printf("\n");
					}	
				}
				
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yz467796454/article/details/81707786