广东工业大学新生赛决赛B题

Problem B: 占点游戏

Description

众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:“我要跟你决一死战!”然后Maple就跟TMK玩起了一个关于占点的游戏。

Maple在一个无限展开的只有整数点的二维平面上找到两个点,由TMKMaple分别操控这两个点,两人轮流操作,每一次操作中TMKMaple可以把他的点移动一格到上、下、左、右四个方向,当TMK操作时,移动到的这个点会被染成红色,而当Maple操作时,移动到的这个点会被染成蓝色,需要注意的是,两个起始时的两个点也都会被染上相应的颜色,而当任一人走到已经染了不同颜色的点,这个颜色会被覆盖掉,当两个点覆盖在一起时,这个点会被后来的点染色。当游戏结束时染着自己颜色的点就代表被自己占领了。

TMK一下就明白了,这个游戏的目标是让自己占领的点比对方占领的点多,而且要让差值最大。

为了公平一些,Maple决定让TMK来选择先手或后手和让TMK来选择点,相应的Maple就会选择另一个点。

现在给出游戏的总轮数NMaple选择的两个点的坐标(x1y1),(x2y2),要TMK来选择先后手和起始点,假设Maple一定按最优策略来走,问TMK能不能选择先后手和起始点使得自己占领的点比Maple占领的多,如果能,那么同时要求出占领的点数的最大差值。

Input

第一行一个T,代表接下来有T组数据(1<=T<=2000)

每组数据有五个整数N,x1,y1,x2,y2,代表了操作的总轮数N以及选择的两个起始点(x1,y1),(x2,y2),其中1<=N<=10^8-10^8<=x1,y1,x2,y2<=10^8,数据保证两个点不相同。

Output

对于每一组数据,如果TMK占领的点不能比Maple占领的多,那么输出-1,否则输出两个占领点数的最大差值。

Sample Input

41 0 0 1 02 0 0 1 01 0 0 2 02 0 0 2 0

Sample Output

2
-1
1
-1
首先,我们要明白这场比赛想要胜利得怎么办,如果不通过占领对方的点,那么这个比赛就没意义,所以比赛的结果与两个参数有关,1.能不能去占领对方的点,2.n的奇偶性,当n为奇数时,先手的人可以多走一步。所以,分以下几种情况考虑:
令 d=abs(x1-x2)+abs(y1-y2) 首先判断(n+1)/2>=d,先手可不可以从一个点走到另一个点 : 如果不可以,则先手可以多得 n&1分。
如果可以,当d为偶数时,此时如果双方在中途相遇时,后手的是优先占领对方的点的,因为双方都是聪明人,会按照最优策略去走,一味的逃离会输两分,中途相遇只会输一分,所以d为偶数时,双方一定会选择在中途相遇,n为偶数时,由于双方走的步数是一样的,后手可以多得一分,n为奇数时,先手多得一分。
d为奇数时,无论是在中途相遇还是单方面逃离,先手的都能抢占先机,所以n为奇数时,先手可以多走一步,多得两分,n为偶数时,后手的可以复仇一波,就是平手。
// by BNU_LZM
#include
#include
#include
using namespace std;

int main()
{
	freopen("in.txt", "r", stdin);
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int n, x1, y1, x2, y2;
		scanf("%d%d%d%d%d", &n, &x1, &y1, &x2, &y2);
		int d = abs(x1-x2)+abs(y1-y2);
		if((n+1)/2 >= d)
			if(d%2)
				if(n%2) printf("2\n");
				else printf("-1\n");
			else printf("1\n");
		else if(n&1) printf("1\n");
			 else printf("-1\n"); 
	}
	return 0;
}

你可能感兴趣的:(数学方法)