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

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

时间:2017-09-24 02:36:36      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:mic   amp   stream   需要   for   pac   memset   题解   log   

题目链接:点我呀

题意:给出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(思维题)

标签:mic   amp   stream   需要   for   pac   memset   题解   log   

原文地址:http://www.cnblogs.com/Leonard-/p/7583590.html

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