FoxPlayingGame srm 501 div2 mid
問題
http://www.topcoder.com/stat?c=problem_statement&pm=11284&rd=14430 (要ログイン)
- 何か、変なゲームの得点を最大にしろ。
- 持ち点0点からスタート
- 動作 A, B をそれぞれ nA, nB行う。
- 動作 A をすると、持ち点 += paramA / 1000
- 動作 B をすると、持ち点 *= paramB / 1000
方針
上手い方法が分からなかったので、力づく。
雑感
落ち着いてやれば、easy は取れる。当面は、easy をさっさと片付けて、mid に充分時間を取り、2問提出を目指すという戦略で行こう。
答案
#include <sstream> #include <string> #include <vector> #include <map> #include <algorithm> #include <iostream> #include <utility> #include <set> #include <cctype> #include <queue> #include <stack> #include <cstdio> #include <cstdlib> #include <cmath> #include <iterator> using namespace std; class FoxPlayingGame{ public: double pow(double x, int n){ double ret = 1; for(int i = 0; i < n; i++){ ret *= x; } return ret; } double theMax(int nA, int nB, int paramA, int paramB){ double sa = paramA / 1000.0; double sb = paramB / 1000.0; if(nB == 0){ return nA * sa; } else if(paramA == 0 || nA == 0){ return 0; } else if(paramB == 0){ return max(nA * sa, 0.0); } else if(paramA > 0){ if(paramB >= 1000){ return nA * sa * pow(sb, nB); } else if(paramB > 0){ return nA * sa; } else if(paramB > -1000){ return nA * sa; } else{ if(nB % 2 == 0){ return nA * sa * pow(sb, nB); } else{ return nA * sa * pow(sb, nB - 1); } } } else{ if(paramB >= 1000){ return nA * sa; } else if(paramB > 0){ return nA * sa * pow(sb, nB); } else if(paramB > -1000){ return nA * sa * sb; } else{ if(nB % 2 == 0){ return nA * sa * pow(sb, nB - 1); } else{ return nA * sa * pow(sb, nB); } } } } };