問題
http://community.topcoder.com/stat?c=problem_statement&pm=2308&rd=4730
鹿を追いかけて捕まえたい。
プレイヤーは速度A,鹿は速度B,距離はCで与えられる。
ただし、鹿は30分走ったあと15分休憩する。
このとき、何分後に鹿を捕まえられるかを求める。
ただし、決して捕まえられない場合はー1を返す。
解き方
シミュレーションで間に合わない場合はお互い走って休んでを1周とすると
何周目に捕まえられるかの計算が必要になるが、
時間Cの最大が10^5なので単純なシミュレーションで間に合う。
コード
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 SlayingDeer {
public: int getTime(int A, int B, int C) {
int rest=C,ret=0;
while(1){
if((A-B)*30<rest){
ret+=30;
rest-=(A-B)*30;
}
else{
ret+=(rest+A-B-1)/(A-B);
return ret;
}
if(A*15<rest){
ret+=15;
rest-=A*15;
}
else{
ret+=(rest+A-1)/A;
return ret;
}
if(rest>=C)return -1;
}
return -1;
}
};
#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 SlayingDeer {
public: int getTime(int A, int B, int C) {
int rest=C,ret=0;
while(1){
if((A-B)*30<rest){
ret+=30;
rest-=(A-B)*30;
}
else{
ret+=(rest+A-B-1)/(A-B);
return ret;
}
if(A*15<rest){
ret+=15;
rest-=A*15;
}
else{
ret+=(rest+A-1)/A;
return ret;
}
if(rest>=C)return -1;
}
return -1;
}
};