Alice‘s Game (hdu 3544)

11 篇文章 0 订阅

最近杭电在病娇什么啊,都上不去。。。

题意大概就是: 给你t个N*M的巧克力, 两个人轮流来分,先手只能竖直分,后手只能水平分,最后不能继续再分的人为输。

我刚开始的想法是用SG函数做,但是推一下就发现不对……然后就找规律……

画了不少图,可以发现,谁都不希望给对手1 × n(或者n × 1)的情况,因为这样对手就会比我多出n - 1步可以走,所以为了推迟1 × n(或者n × 1)这种情况的到来,在分的时候就要平分,然后后面的人要选小块的来分 。因为是平分,那么只要看平分后的其中一块就可以,因为其他块也是一样的情况,最后只要分到n × 1(或者1 × n)这种情况出现就可以定胜负了。还要注意,谁面对n × n这种情况一定是输的。

#include <stdio.h>
int main (void)
{
	int t, n, c = 0;
	scanf("%d", &t);
	while(t --)
	{
		c ++;
		scanf("%d", &n);
		int i, a = 0, b = 0;
		//a代表先手能切几次,b代表后手能切几次(只对于平分后的其中一块来说) 
		long long x, y;
		for(i = 0; i < n; i++)
		{
			scanf("%lld %lld", &x, &y);
			while(x > 1 && y > 1)
			{
				x /= 2;
				y /= 2;
				a ++;
				b ++;
			}
			//printf("a = %d, b = %d\n", a, b);
			if(x == 1)
				b += y - 1;
			if(y == 1)
				a += x - 1;
			//printf("a = %d, b = %d\n", a, b);
		}
		printf("Case %d : ", c);
		if(a > b)
			printf("Alice\n");
		else
			printf("Bob\n");			
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值