250
R,G,B,Yの4パターンがランダムに並べられたとき、同じパターンが隣り合わないように他のパターンに差し替える最小回数を求めるらしい
#include<string> using namespace std; class ColorfulTilesEasy{ public: int theMin(string room){ int j = room.length(); int i,ans = 0; int chc; char ptn[] = {'R','G','B','Y'}; for(i = 0; i < j - 1; i ++){ if(room[i] == room[i + 1]){ ans ++; chc = 0; while(1){ if((room[i + 1] != ptn[chc]) && (room[i + 2] != ptn[chc])) break; chc++; } room[i + 1] = ptn[chc]; i++; } } return ans; } };適当に考えたけど、アルゴリズムとしては、隣り合った2つの2番目を入れ替えれば前にも後にも影響が無い、と思う。
後から気づいたけど、これi += 2でやっても多分問題ないよね。
500
タロイモと花子が揚げ芋を4の累乗ずつ食べていって最後の一個を喰らったら勝ちという問題。
実際いろいろ試した結果、末尾が0,2,5,7の時は花子が勝つらしいことに気づく。
#include<string> using namespace std; class PotatoGame{ public: string theWinner(int n){ int ptn[] = {1,3,4,6,8,9}; int i; n = n % 10; bool f = false; for(i = 0; i < 6; i++){ if(n == ptn[i]) f = true; } if(f == true){ return ("Taro"); }else{ return ("Hanako"); } } };
今回は特に規則性を思いつかなかったからパターンを配列化してしまったけど、n%5 == 0 or 2なら花子が勝ちだから
#include<string> using namespace std; class PotatoGame{ public: string theWinner(int n){ if(n % 5 == 2 || n % 5 == 0){ return ("Taro"); }else{ return ("Hanako"); } } };確認してないけどこれでいけると思う。
明日はこれの1000点問題をちょっとといてみたいと思う。
ってかRGBYのどれが当てはまるかは判定しなくていいよね
返信削除