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);
	}
      }
    }
  }



};