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

题意:不知道为啥这道不算太难的博弈会是550分的题,考察细节吧。Ciel和Liss在一条直线的两点,相距距离为d,他们每次能走的最大距离为mov1,mov2,他们的武器能够到的范围为rng1,rng2,Ciel先走,每一步包括走一段并可以尝试用武器打对方,每个人都用最优策略走,问谁会赢,还是平局

分析:1、首先应该考虑第一回合会不会分出胜负,若mov1+rng1>=d,那么Ciel赢,若mov2+rng2>=d+mov1,Liss赢(Liss后手,要加mov1)

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





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值