SRM501 Div1Easy FoxPlayingGame
http://community.topcoder.com/stat?c=problem_statement&pm=11284
1年生 | Aizu Online Judgeを解いた経験からDP解を思いつくも、うまくいかない。しぶしぶ考察すると、「足してから掛けたい」「正負は融通が利くので絶対値を大きくしたい」など思いついたため、全部入れ込んだ。
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) class FoxPlayingGame { public: double theMax( int nA, int nB, int paramA, int paramB ) { double scoreA=paramA/1000.0,scoreB=paramB/1000.0; double ret1=scoreA*nA; double ret2=ret1; for(int i=0;i<nB;i++) ret2*=scoreB; // Bの絶対値1未満 if(abs(scoreB)<1){ // Aが非負→A*nA if(scoreA>=0) return ret1; // Aが負 else{ // Bが非負→A*nA*(B^nB) if(scoreB>=0) return ret2; // Bが負→A*nA*B return ret1*scoreB; } } // Bの絶対値1以上 else{ // Aが非負→A*nA*(B^nB)偶数回 if(scoreA>=0){ if(nB%2==0) return ret2; else return ret2/scoreB; } // Aが負 else{ // Bが非負→A*nA if(scoreB>=0) return ret1; // Bが負→A*nA*(B^nB)奇数回 if(nB%2==1) return ret2; else return ret2/scoreB; } } } };
追記:他人の解法が鮮やかすぎて直視できない