Topcoder SRM652 Div2 easy
SRM652のDiv2に参加したぞい!情けないことにeasyしか解けなかったぞい!
何が難しいって英語が難かしい。easyの問題も理解するのに時間がかかったしmediumの問題に関しては今読み返しても何すればいいのかわからない…今回は特別難解だった気がするのは気のせいかな。
easyの問題
http://community.topcoder.com/stat?c=problem_statement&pm=13678
文字列sが与えられる。aからzに1から26の数字をそれぞれ割り当て、とある文字Xの数値をval[X]と表す。たとえば、val['a'] = 1、val['e'] = 5である。
文字列の値を次のように定義する。文字列sを構成するs[i]それぞれに、文字列sに含まれるval[s[i]]以下の値の文字の数をk[i]と定義する。その時、文字列sの値はk[i]*val[s[i]]の総和で定義される。
たぶんそんな感じ…
s = "babac"の場合
aに割り当てられた数値は1、a以下の値を持つ文字はaのみなので2文字。
bに割り当てられた数値は2、b以下の値を持つ文字はaとbだから4文字。
cに割り当てられた数値は3、c以下の値を持つ文字はaとbとcだから5文字。
よってsの値は
1*2 + 2*4 + 1*2 + 2*4 + 3*5 = 35
となる。
そして私の書いたコードはこちら
class ValueOfString: def findValue(self,s): d = {"a":1,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9,"j":10,"k":11,"l":12,"m":13,"n":14,"o":15,"p":16,"q":17,"r":18,"s":19,"t":20,"u":21,"v":22,"w":23,"x":24,"y":25,"z":26} sum = 0 for i in range(len(s)): count = 0 for j in range(len(s)): if d[s[i]] >= d[s[j]]: count = count + 1 sum = sum + d[s[i]] * count return sum
許して…
pythonでのアスキーコードの扱い方わからなかったから…
あんまりひどいからなかったことにしようと思ったけど戒めのために残しておこうかなって…
文字→ascii。ascii→文字 ord, chr » Python Snippets
ここを見てodr()でアスキーコード取得できることを知って書き直したコードがこれ
class ValueOfString: def findValue(self,s): sum = 0 for i in range(len(s)): for j in range(len(s)): if ord(s[i]) >= ord(s[j]): sum += (ord(s[i]) - ord("a") + 1) return sum
辞書を使って書き直したコードがこちら
class ValueOfString: def findValue(self,s): dic = {} for i in range(len(s)): if s[i] in dic: dic[s[i]] = dic[s[i]] + 1 else: dic[s[i]] = 1 ret = 0 sum = 0 for i in sorted(dic): sum += dic[i] ret += (ord(i) - ord("a") + 1) * sum * dic[i] return ret
forループで辞書を置いたらキーが取り出されるのか値が取り出されるのかとか不安だったけど動いたので辞書の勉強はまた今度にしよう…
辞書をスマートに使える子になりたい。あと変数の名前のセンスな。
とりあえずdiv2のmediumが解けなくて灰色になるような悲しい経験は二度とないようにしたいな!!