SRM 148 Div2
250:
問題概要
int型の変数numberが与えられる
numberに含まれる数字でnumberを割りきれるものの数をリターンしろ
0はいかなる値も割り切らない
解法
実際にやってみる
コード:
class DivisorDigits { public: string itos(int d){stringstream ss;ss << d; return ss.str();} int howMany(int number) { string sn = itos(number); int cnt = 0; for(int i=0;i<sn.size();i++) { if(sn[i] == '0') continue; if(number % (sn[i]-'0') == 0) cnt++; } return cnt; } };
600:
問題概要
AからZまでのアルファベットの位置の値を"*:*"の形で指定されたように変更する
"*:*"は左の*と右の*のアルファベットの位置の値をスワップすることを意味する
最初にアルファベットのAからZまで正しい位置にある
例:
A B C D ・・・ Z
A:B -> B A C D ・・・ Z
B:C -> B C A D ・・・ Z
解法
実際にやってみる
コード:
class CeyKaps { public: string decipher(string typed, vector <string> switches) { char alpha[28]; for(int i=0;i<26;i++) alpha[i] = (char)('A'+i); for(int i=0;i<switches.size();i++) swap(alpha[switches[i][0]-'A'],alpha[switches[i][2]-'A']); int index[27]; for(int i=0;i<26;i++) index[alpha[i]-'A'] = i; string ret; for(int i=0;i<typed.size();i++) ret += (char)('A'+index[typed[i]-'A']); return ret; } };
1000:
問題概要
0以上9以下の数字が9個与えられる
そこから作れる3*3のmagic number squareの数をリターンせよ
magic number squareとは各列と各行の和が全て等しいsquareのことである
解法
これまた実際にやってみる
コード:
class MNS { public: map<vector<int>,bool> memo; long long sum; bool check(vector<int>& n) { int sum = n[0] + n[1] + n[2]; if(sum == (n[3]+n[4]+n[5]) && sum == (n[6]+n[7]+n[8]) && sum == (n[0]+n[3]+n[6]) && sum == (n[1]+n[4]+n[7]) && sum == (n[2]+n[5]+n[8]) ) return true; return false; } string vtos(vector<int>& n,int pos) { stringstream ss; for(int i=0;i<pos;i++) ss << n[i]; return ss.str(); } void dfs(vector<int>& x,vector<int>& n,int pos,int used) { if(pos) { if(pos >= 9) { if(memo[x]) return; memo[x] = true; if(check(x)) sum++; return ; } } for(int i=0;i<9;i++) { if((used >> i) & 1) continue; x[pos] = n[i]; dfs(x,n,pos+1,used|(1<<i)); } } int combos(vector <int> numbers) { memo.clear(); sum = 0; vector<int> x(9); dfs(x,numbers,0,0); return sum; } };