SRM537に参加しました。
250、550ともにサンプルは通せましたが細かなバグが残っておりシステムに落とされました。
かなり悔しいので次のSRM538はHardを力技でも通します。
250解法 && src
母音(a,i,u,e,o)を準備し、それに該当するものをnameから探す。
母音が2つでない場合は"NO"をreturn
母音が2つだが、その2つが同じでない場合は"NO"をreturn
name.size()が8でなかったら"NO"をreturn
上記以外の場合"YES"をreturn
実際には、最初にname内から出現する母音を保存し、次の母音と一致するかを判定しました。
本番では、最初に出現する母音の初期値を'z'にしてしまったため、その後のif文でname内に、zが最初の母音より先に出た場合、正しい結果を返さないといった結果となってしまっていました。
教訓1:初期値は"絶対に"考えられない値を入れよう!!
string isValid(string name) { string result; vector<char> bo; bo.push_back('a'); bo.push_back('i'); bo.push_back('u'); bo.push_back('e'); bo.push_back('o'); if(name.size() != 8) { return "NO"; } //本番はここをzにしてたから、zが含まれていた場合不正解になった char b = 'A'; int b_count = 0; for(int i=0;i < name.size();i++) { for(int j=0;j < bo.size();j++) { if(b == 'A' && name[i] == bo[j]) { b = name[i]; b_count++; break; }else if(b != name[i] && name[i] == bo[j]) { return "NO"; }else if(name[i] == b){ b_count++; break; } } } if(b_count == 2) return "YES"; return "NO"; }
550解法 && src
基本的に、Xと1 ~ MAX(AとBの大きい方)までのYの中で、(X*p + Y*q)の値がA及びBになるYを探索します。(p及びq:0 ~ MAX)
それに加え、AとX及びBとXを割った余りが0の時、解が無限に存在する為return -1する。
ここで本番は、XがAとBよりも大きい時return 1とする。としてしまったが、これではダメなケースがあり、A=99,B=93,X=176の場合、Y = 3でも可能になってしまうので、この処理は要りませんでした。
教訓2:問題文に書いてない条件は、処理時間が膨大にならないかぎり書かないようにしよう!!
int howMany(int A, int B, int X) { int result = 0; if(A % X == 0 && B % X == 0) { return -1; }/*else if(A < X && B < X) { return 1; }*/ //本番では上記の処理を追加していたことによって不正解が出た result++; int max = 0; if(A > B) { max = A; }else { max = B; } vector<int> hoge; for(int i=2;i <= max;i++) { bool flag = false; for(int j=0;j <= max;j++) { for(int z =0;z <=max;z++) { if((X*j+i*z) > A) break; if((X*j+i*z) == A) { flag = true; break; } } } if(flag) { for(int j=0;j <= max;j++) { for(int z=0;z <= max;z++) { if((X*j+i*z) > B) break; if((X*j+i*z) == B) { hoge.push_back(i); break; } } } } } //重複削除 vector<int>::iterator end_it = unique( hoge.begin(), hoge.end() ); hoge.erase( end_it, hoge.end() ); result += hoge.size(); return result; }