TopCoder SRM 154 Div2
oox
@ichigo_o_reさん & @HETARE09さん と練習してました。
誤差落ち怖い...
300
本日の販売実績が "#{販売額} #{原価}" という文字列で複数与えられる。
『利益÷原価=利益率』とすると、本日の利益率は何%か。(小数点以下は切り捨てて、整数で答えよ)
ただし、原価の総額は0より大きい
このころのTopCoderは、文字列のパースをさせる問題がまだ存在していたようです。
stringstreamを惜しまず使わせていただきました。
0除算が起こらないようになっているのはeasyらしいところ。
450
ROT13という暗号化アルゴリズムを知っているだろうか。
シーザー暗号の一種で、暗号化の際にはアルファベットを13文字後ろにずらせばよい。
もっと使いやすくするために、UPPERCASEとlowercase、数字や空白などが混じっている時の操作も定義することにした。
UPPERCASEは、UPPERCASE内で13文字後ろにずらす
- A-M → N-Z
- N-Z → A-M
lowercaseは、lowercase内で13文字後ろにずらす
- a-m → n-z
- n-z → a-m
数字は、5つ後ろにずらす
- 0-4 → 5-9
- 5-9 → 0-4
空白は、そのままにする。
- ' ' → ' '
文字列が与えられるので、暗号化せよ。
#include <cctype>
1000
『良い順位付け』のために、「『各項目における順位』を合計した値」を元に順位を決めることになった。
最終的な順位は、次のように決まる。
- 各項目における順位を求め、それを合計した値を比較する
- ↑でダブった場合は、各項目の得点(順位ではない)の合計値を比較する
- ↑もダブった場合は、名前を辞書順比較する
順位付けして、"#{名前} #{『各項目における順位』を合計した値} #{得点の合計}"という書式のStringの配列を返せ
3.の『ダブった場合は』のところで、得点の合計値(浮動小数点数)を == で比較してしまい、誤差落ち。
いわゆる EQ関数 に修正するだけで通ってしまいました(´;ω;`)ブワッ
300
struct ProfitCalculator { int percent(vector <string> items) { double a = 0.0; double b = 0.0; rep(i,items.size()) { istringstream is(items[i]); double fa, fb; is >> fa >> fb; a += fa; b += fb; } return (int)(100 * (a - b) / a); } };
450
struct SuperRot { string decoder(string message) { const int N = message.length(); stringstream ss; rep(i,N) { const char c = message[i]; if(isdigit(c)) { int d = c - '0'; ss << (d + 5) % 10; } else if(islower(c)) { int d = c - 'a'; char nc = ((d + 13) % 26) + 'a'; ss << nc; } else if(isupper(c)) { int d = c - 'A'; char nc = ((d + 13) % 26) + 'A'; ss << nc; } else { ss << c; } } return ss.str(); } };
1000
bool EQ(const double &a, const double &b) { return fabs(a - b) < EPS; } struct Node { string name; int rank; double score; vector<double> v; void calc() { score = accumulate(v.begin(), v.end(), 0.0); } bool operator <(const Node &c) const { if(rank != c.rank) return rank < c.rank; if(EQ(score, c.score) == false) return score > c.score; return name < c.name; } }; struct ContestScore { vector <string> sortResults(vector <string> data) { const int N = data.size(); if(N == 0) return vector<string>(); vector<Node> v(N); rep(i,N) { istringstream is(data[i]); is >> v[i].name; double d; while(is >> d) v[i].v.push_back(d); v[i].rank = 0; v[i].calc(); } const int L = v[0].v.size(); rep(l, L) { vector<int> rv(N); rep(i,N) rv[i] = (int)((v[i].v[l] + EPS) * 10); sort(rv.rbegin(), rv.rend()); rep(i,N) { v[i].rank += lower_bound(rv.begin(), rv.end(), (v[i].v[l] + EPS) * 10, greater<int>()) - rv.begin(); v[i].rank++; } } sort(all(v)); vector<string> ret; rep(i,N) { stringstream ss; char score_str[1024]; sprintf(score_str, "%.1f", v[i].score); ss << v[i].name << " " << v[i].rank << " " << score_str; ret.push_back(ss.str()); } return ret; }