CODE FESTIVAL 2017 qual A C Palindromic Matrix(思维题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CODE FESTIVAL 2017 qual A C Palindromic Matrix(思维题)相关的知识,希望对你有一定的参考价值。

题目链接:点我呀

题意:给出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 }

 

以上是关于CODE FESTIVAL 2017 qual A C Palindromic Matrix(思维题)的主要内容,如果未能解决你的问题,请参考以下文章

java CODE FESTIVAL 2017 qual B问题A.

CODE FESTIVAL 2017 qual A--B-fLIP(换种想法,暴力枚举)

CODE FESTIVAL 2017 qual A--C - Palindromic Matrix(模拟所有情况,注意细节)

[Atcoder Code Festival 2017 Qual B Problem F]Largest Smallest Cyclic Shift

CODE FESTIVAL 2017 qual B C - 3 Steps

Atcoder Code Festival 2017 qual C 10.22 D题题解