問題
http://community.topcoder.com/stat?c=problem_statement&pm=3003&rd=5858
あるチームの直近の勝ち負けの結果が与えられる。
そこから、直近のいつまでがもっとも勝率がよくて、直近のいつまでがもっとも勝率が悪かったかを求める。
ただし、答えは3ゲーム目以降の結果から比較する。
解き方
直近の1試合前から最後まで勝率を計算しベストとワーストのものを更新していけばよい。
2ゲーム目までは比較対象にせず、3ゲーム目から更新していく。
コード
using namespace std;
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class WinningRecord {
public: vector<int> getBestAndWorst(string games) {
vector<int> ans(2,0);
double best=0.0,worst=0.0;
double wins=0,loses=0;
FORE(i,0,games.size()){
if(games[i]=='W')wins++;
else loses++;
if(i<2)continue;
if(best<=wins/(wins+loses)){
best=wins/(wins+loses);
ans[0]=i+1;
}
if(worst<=loses/(wins+loses)){
worst=loses/(wins+loses);
ans[1]=i+1;
}
}
return ans;
}
};
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class WinningRecord {
public: vector<int> getBestAndWorst(string games) {
vector<int> ans(2,0);
double best=0.0,worst=0.0;
double wins=0,loses=0;
FORE(i,0,games.size()){
if(games[i]=='W')wins++;
else loses++;
if(i<2)continue;
if(best<=wins/(wins+loses)){
best=wins/(wins+loses);
ans[0]=i+1;
}
if(worst<=loses/(wins+loses)){
worst=loses/(wins+loses);
ans[1]=i+1;
}
}
return ans;
}
};