Maverick

never stop thinking

TopCoder SRM 598 Div1 第2题

Problem Statement

Fox Ciel is playing a board game with her friend Squirrel Liss. The game is played on an infinite strip of paper. The strip of paper is divided into consecutive cells. Each cell has an integer coordinate. Formally, for each integer i, the left neighbor of cell i is cell (i-1) and the right neighbor of cell i is cell (i+1).

Each of the players has a single token called the fencer. At the beginning of the game, Ciel's fencer is in cell 0 and Liss's fencer is in cell d. Each of the fencers has two limits: its maximum move length and its hitting range. For Ciel's fencer the maximum move length is mov1 and the hitting range is rng1. Similarly, for Liss's fencer we have the parameters mov2 and rng2. Note that the parameters of Liss's fencer may differ from the ones of Ciel's fencer.

The players take alternating turns. Ciel goes first. In each turn the current player starts by moving her fencer. The distance between the original cell and the destination cell must be at most equal to the fencer's maximum move length. (It is also allowed to leave the fencer in the same cell.) Then, the current player checks whether the other fencer lies within the hitting range - that is, whether the current distance between the fencers is at most equal to the current fencer's hitting range. If that is the case, the game ends and the current player wins.

You are given the ints mov1, mov2, rng1, rng2, and d. Return "Ciel" (quotes for clarity) if Fox Ciel has a winning strategy, "Liss" if Squirrel Liss has a winning strategy, and "Draw" otherwise.

Definition

 Class: FoxAndFencing Method: WhoCanWin Parameters: int, int, int, int, int Returns: string Method signature: string WhoCanWin(int mov1, int mov2, int rng1, int rng2, int d) (be sure your method is public)

Constraints

-

mov1 will be between 1 and 100,000,000, inclusive.

-

mov2 will be between 1 and 100,000,000, inclusive.

-

rng1 will be between 1 and 100,000,000, inclusive.

-

rng2 will be between 1 and 100,000,000, inclusive.

-

d will be between 1 and 100,000,000, inclusive.

Examples

0)

 1 58 1 58 2

Returns: "Ciel"

 The attributes of Ciel's fencer are much smaller than the attributes of Liss's fencer. Luckily for Ciel, she can win the game in her first turn: she should move her fencer to cell 1 and from there she can hit the other fencer.

1)

 2 1 1 100 50

Returns: "Liss"

 Ciel cannot score a hit in the first turn. After Ciel's turn, her fencer will be on one of the cells {-2,-1,0,1,2}. Regardless of its precise location, Liss can always move her fencer one cell to the left and then hit Ciel.

2)

 2 1 1 100 150

Returns: "Draw"

 Clearly, Ciel has no chance of winning this game. However, this time the initial distance d is big enough for Ciel to escape.

3)

 100 100 100 100 100000000

Returns: "Draw"

4)

 100 1 100 1 100000000

Returns: "Ciel"

5)

 100 1 100 250 100000000

Returns: "Draw"

6)

 100 1 100 150 100000000

Returns: "Ciel"

7)

 100 50 100 1 100000000

Returns: "Ciel"

8)

 100 150 100 1 100000000

Returns: "Draw"

2、若第一回合分不出胜负，那么需要比较mov1，mov2（之前考虑比较mov1+rng1和mov2+rng2，发现并不正确，每次只能走mov步，所以要按mov来分情况）

（1）mov1==mov2，一定是平局

（2）mov1>mov2，Ciel走得快，那么Ciel如果想赢，必须在追着Liss走了x步时能打到Liss，但是又要防止Liss在x-1步时反向走倒打一耙，所以需要满足条件，

mov1-mov2+rng1>mov2+rng2。也可以理解为，当Ciel走到和Liss距离为mov1+rng1时，Liss又会走mov2，那么Ciel必须保证第x步走到和Liss距离为mov1-mov2+rng1，然后Liss走第x步走过mov2，然后这时轮到Ciel走第x+1步，此时距离为mov1+rng1，那么一走一打刚好打到Liss，其中，当Ciel走完第x步而Liss未走第x步时，二者距离最近，为mov1-mov2+rng1，必须保证这个距离大于mov2+rng2，否则Liss就会倒打一耙，就是平局。

（3）mov1<mov2，和(2)同理

#include<string>
#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;

class FoxAndFencing
{
public:
string WhoCanWin(int mov1, int mov2, int rng1, int rng2, int d)
{
if(mov1+rng1>=d) return "Ciel";
else if(mov2+rng2>=mov1+d) return "Liss";

if(mov1>mov2)
{
if((mov1-mov2)+rng1 > mov2+rng2) return "Ciel";
return "Draw";
}
if(mov1<mov2)
{
if((mov2-mov1)+rng2 > mov1+rng1) return "Liss";
return "Draw";
}
return "Draw";
}
};

int main()
{
FoxAndFencing t;
cout << t.WhoCanWin(2,1,1,100,50)<<endl;
}



TopCoder SRM 697 div1

2016-08-18 23:29:23

TopCoder SRM 669 DIV 1

2015-10-03 21:52:00

[最小割] Topcoder SRM558Div1. SurroundingGame

2018-03-08 18:40:45

TopCoder SRM 602 Div1 第1题

2013-12-30 20:48:10

TopCoder SRM 598 Div1 第1题

2013-12-02 20:20:27

Topcoder：SRM 708 算法题解

2017-02-11 11:21:07

TopCoder入门教程

2013-12-17 14:58:51

SRM 584 第一次玩TopCoder。。。只水题一道。。。

2013-07-11 00:40:36

Topcoder好题推荐 ( 持续更新中)

2016-04-01 17:06:24

TopCoder SRM(Arena) 一日游记

2014-06-26 14:59:41