CODE FESTIVAL 2017 qual A C Palindromic Matrix(思維題)
阿新 • • 發佈:2017-09-24
int 字母 esp != 題意 nbsp class task col
題目鏈接:點我呀
題意:給出n*m由26位小寫字母組成的矩陣,問是否能夠重構形成一個每行每列都是回文的矩陣
題解:分三種情況考慮(偶偶,奇奇,奇偶),每種情況下考慮最少 需要4個相同字母的字母數,2個相同字母的字母數和一個字母的字母數(只有奇奇的時候才需要一個字母)
最後判斷一下。感覺自己的這個代碼不是很簡潔,明天起來看看別人怎麽寫的,睡覺去...
1 //Atcoder 3 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespacestd; 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){//偶偶 19int 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(思維題)