题目链接:点我呀
题意:给出n*m由26位小写字母组成的矩阵,问是否能够重构形成一个每行每列都是回文的矩阵
题解:分三种情况考虑(偶偶,奇奇,奇偶),每种情况下考虑最少 需要4个相同字母的字母数,2个相同字母的字母数和一个字母的字母数(只有奇奇的时候才需要一个字母)
最后判断一下。感觉自己的这个代码不是很简洁,明天起来看看别人怎么写的,睡觉去...
1 //Atcoder 3 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int num[30]; 8 9 int main(){ 10 memset(num,0,sizeof(num)); 11 char tmp; 12 int n,m; 13 cin>>n>>m; 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=m;j++) 16 cin>>tmp,num[tmp-‘a‘]++; 17 18 if(n%2==0&&m%2==0){//偶偶 19 int cnt4=0; 20 for(int i=0;i<26;i++){ 21 cnt4+=num[i]/4;num[i]%=4; 22 } 23 if(4*cnt4!=n*m) {cout<<"No"<<endl;return 0;} 24 } 25 else if((n*m)%2==1){//奇奇 26 int cnt1=0,cnt2=0,cnt4=0; 27 for(int i=0;i<26;i++){ 28 cnt4+=num[i]/4;num[i]%=4; 29 cnt2+=num[i]/2;num[i]%=2; 30 cnt1+=num[i]; 31 } 32 if(cnt1!=1||(2*cnt2+4*cnt4)!=(n*m-1)||(4*cnt4)<(n*m-1-2*(n/2+m/2))) 33 {cout<<"No"<<endl;return 0;} 34 } 35 else if((n*m)%2==0){//奇偶 36 int cnt2=0,cnt4=0; 37 for(int i=0;i<26;i++){ 38 cnt4+=num[i]/4;num[i]%=4; 39 cnt2+=num[i]/2;num[i]%=2; 40 } 41 if((2*cnt2+4*cnt4)!=(n*m)||(4*cnt4<(m/2*2)*(n/2*2))) 42 {cout<<"No"<<endl;return 0;} 43 } 44 45 cout<<"Yes"<<endl; 46 return 0; 47 }
时间: 2024-10-05 23:35:41