TopCoder SRM 598 Div1 第2题

原创 2013年12月02日 21:15:29

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





 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

TopCoder SRM 598 Div1 第1题

Problem Statement   Fox Ciel has some items. The weight of the i-th (0-based) item is...

TopCoder SRM 609 Div1 第2题

Problem Statement   We have balls of K different colors. The colors are numbered 0 through ...

TopCoder SRM 589 Div2 第2题

类型:DP  难度:2 题意:一堆齿轮两两相邻排成一圈,给出每个齿轮旋转方向,齿轮首尾相连,即n个齿轮,0和n-1相邻,齿轮与左右相邻的齿轮方向都相反才能转动,去掉一个齿轮,左右齿轮不看成相邻,问至...

TopCoder SRM 602 Div1 第1题

Problem Statement   TypoCoder is a programming contest like TopCoder. TypoCoder also ...

TopCoder SRM 597 Div1 第3题

Problem Statement   Little Elephant from the Zoo of Lviv has a board with 2 rows and M column...

TopCoder SRM 597 Div1 第1题

Problem Statement   Little Elephant from the Zoo of Lviv likes strings. You are given a str...

TopCoder SRM 604 Div1 第1题

Problem Statement   Fox Ciel has a robot. The robot is located on an infinite plane. At the...

topcoder算法题SRM144 DIV1 500分题

Problem Statement   In most states, gamblers can choose from a wide variety of different ...

topcoder SRM500 DIV1 LEVEL1 250分题

Problem Statement   N friends (numbered from 0 to N-1) play a game called Mafia. The exact ...

TopCoder 250 points 17-SRM 152 DIV 1 106.51/250 42.60%

Problem Statement   You and your friends are setting up a fantasy TopCoder league, where ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)