[题解][cf]1738_C_Even Number Addicts

题目描述

https://codeforces.com/contest/1738/problem/C
在这里插入图片描述

题意

两个人玩游戏.
n n n个整数, 两个人轮流取数, 直到 n n n个数取完为止.
问: 如果规定先手最终取得的数之和为偶数, 则该先手获胜. 问, 先手是否获胜.

思路

dp

  • 首先意识到: 数的大小不重要, 重要的是 n n n个数中奇数和偶数的个数, 设他们分别为 c n t 1 cnt1 cnt1 c n t 0 cnt0 cnt0
  • 考虑两种最简单的特殊情况,初始时 c n t 0 = 0 cnt0=0 cnt0=0 c n t 1 = 0 cnt1=0 cnt1=0, 很容易想到这两种情况下的解
  • 除了以上两种情况, 先手第一步有两个选择:
    1. 选择一个奇数
    2. 选择一个偶数
      以上两种选择情况, 只要有一种最终可以使此人拿到偶数和, 此人就获胜.
  • 那么就可以将此人先手是否获得偶数和 e v e n [ c n t 1 ] [ c n t 0 ] even[cnt1][cnt0] even[cnt1][cnt0]根据他选择的是奇数还是偶数进行转移, 即他的对手想要获胜的情况.
    例如: 先手A首轮选择了奇数, 那么他的对手B想要获胜, 就要阻止A在后面 [ c n t 1 − 1 ] [ c n t 0 ] [cnt_1-1][cnt_0] [cnt11][cnt0]的数中再累计拿到奇数和构成偶数, 那么B就要根据 c n t 1 − 1 cnt_1-1 cnt11的奇偶进行选择

code

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<int, int > PII;
typedef long long ll;
const int N = 110;
bool odd[N][N];
bool even[N][N];

void solv()
{

	int n;
	cin >> n;
	int x;
	int cnt1 = 0;
	for(int i = 0; i < n; i ++)
	{
		cin >> x;
		if(x & 1) cnt1 ++;
	}
	int cnt0 = n - cnt1;
	if(even[cnt1][cnt0]) cout << "Alice\n";
	else cout << "Bob\n";
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T;
	cin >> T;

	for(int i = 1; i <= 100; i ++)
	{
		even[i][0] = (i + 1) / 2 & 1 ^ 1;
		even[0][i] = 1;
		odd[i][0] = (i + 1) / 2 & 1;
		odd[0][i] = 0;
	}

	for(int i = 0; i <= 100; i ++)
		for(int j = 0; j <= 100; j ++)
			if(i && j)
			{
				if(i&1) 
				{
					even[i][j] |= !even[i - 1][j];
					even[i][j] |= !even[i][j - 1];

					odd[i][j] |= !odd[i - 1][j];
					odd[i][j] |= !odd[i][j - 1];
				}
				else 
				{
					even[i][j] |= !odd[i - 1][j];
					even[i][j] |= !odd[i][j - 1];

					odd[i][j] |= !even[i - 1][j];
					odd[i][j] |= !even[i][j - 1];
				}
			}

	while(T --)
	{
		solv();
	}


	return 0;
}

注意与总结

看数据范围往往可以猜测用什么算法解决问题.

知识补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值