51nod 1430:奇偶游戏 博弈
有n个城市,第i个城市有ai个人。Daenerys和Stannis是两个恶魔。他们在玩一个游戏,他们轮流去破坏城市。每一轮破坏一个城市并杀光里面所有的人。直到剩下k个城市为止。
如果最后剩下的总人数是偶数那么Daenerys获得胜利,否则Stannis获得胜利。
现在给定一个局面,要求你来判断一下谁会赢,Stannis先出手。
单组测试数据。
第一行包含两个整数n,k (1 ≤ k ≤ n ≤ 2*10^5)表示刚开始的城市数目和最后剩下的城市数目。
第二行有n个整数a1,a2,a3,…,an。 (1 ≤ ai ≤ 10^6),表示每个城市里面的人数。
对于每一组数据输出胜者。
3 1
1 2 1
3 1
2 2 1
Stannis
Daenerys
哇,六级题拿了金牌好开心~。
其实最后剩下的人数是奇数还是偶数,取决于的是奇数人城市的数目。想起福尔摩斯的那句话,“抛去所有不可能的,剩下的无论多么不可相信,但那就是真相。”这个题目我一开始想的就是最后走的那个可以控制剩下的人是奇数还是偶数啊,所以肯定是最后的那个人赢。
除非剩下的那些城市全部都是奇数,或者全部都是偶数,那样的话结果就不由他定了,只能听天由命。
所以把可以控制的情况排除,剩下的就是代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; long long n, k, temp, cnt1,cnt2; int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout);
long long i;
scanf("%lld%lld", &n, &k); cnt1 = 0;
for (i = 1; i <= n; i++)
{
scanf("%lld", &temp);
if (temp & 1)//奇数的城市有cnt个
cnt1++;
}
cnt2 = n - cnt1;//偶数的城市数量 //如果后手能够把奇数座城市全部拿下的话,一定是后手赢
if (cnt1 <= ((n - k) / 2))
{
cout << "Daenerys" << endl;
return 0;
}
//如果后手能将所有偶数个城市拿下的话并且剩下的城市是偶数个,一定是后手赢
if (((k & 1) == 0) && cnt2 <= ((n - k) / 2))
{
cout << "Daenerys" << endl;
return 0;
}
//如果先手能将所有偶数个城市拿下的话并且剩下的城市是奇数个,一定是先手赢
if (((k & 1) == 1) && cnt2 <= ((n - k) / 2))
{
cout << "Stannis" << endl;
return 0;
}
//一开始忘了考虑这里,如果两人什么都不取的话,那肯定就是初始状态,奇数个城市如果是偶数个的话就是后手赢,否则就是先手赢
if (n == k)
{
if ((cnt1 & 1)==0)
{
cout << "Daenerys" << endl;
return 0;
}
else
{
cout << "Stannis" << endl;
return 0;
}
}
//剩下的情况就是 剩下的城市有一部分是奇数城 有一部分是偶数城市,谁都不能全部拿下
//那么此时如果先手多拿一次的话,可以调整 必赢
if ((n - k) & 1)
{
cout << "Stannis" << endl;
return 0;
}
else//否则后手可以调整,后手赢
{
cout << "Daenerys" << endl;
return 0;
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
51nod 1430:奇偶游戏 博弈的更多相关文章
- 51 Nod 1430 奇偶游戏(博弈)
1430 奇偶游戏 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有n个城市,第i个城市有ai个人.Daenery ...
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- 51Nod 1070 Bash游戏 V4(斐波那契博弈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1070 题意: 思路: 这个是斐波那契博弈,http://blog.csd ...
- 51nod 1070 Bash游戏 V4 (斐波那契博弈)
题目:传送门. 有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下: 1)先手不能在第一次把所有的石子取完,至少取1颗: 2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的 ...
- 51nod 1490: 多重游戏(树上博弈)
题目链接 该题实质上是一个树上博弈的问题.要定义四种状态——2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必败态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...
- 51nod 1066 - Bash游戏,简单博弈
有一堆石子共有N个.A B两个人轮流拿,A先拿.每次最少拿1颗,最多拿K颗,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得比赛. 例如N = 3 ...
- 51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
首先,51nod的那道题就是最简单的尼姆博弈问题. 尼姆博弈主要就是判断奇异局势,现在我们就假设有三个石子堆,最简单的(0,n,n)就是一个奇异局势,因为无论先手怎么拿,后手总是可以在另一堆里拿走相同 ...
- tyvj P1075 - 硬币游戏 博弈DP
P1075 - 硬币游戏 From price Normal (OI)总时限:10s 内存限制:128MB 代码长度限制:64KB 背景 Background 农民John的牛喜欢玩 ...
- 计蒜客 取数游戏 博弈+dp
题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...
随机推荐
- JS监听手机物理返回键,返回到指定页面
pushHistory(); window.addEventListener("popstate", function(e) { window.location = data.in ...
- [排错] VO对象和POJO对象的关系
这或许是一个很蠢的笔记吧...... 这次项目中, 作为一个新人, 没少被这两个概念虐得死去活来的, 现在特别做一次记录, 关于它们二者之间在项目中的应用. 在这里呢, 就不再赘述 VO(view o ...
- UOJ Contest #50: Goodbye Jihai
比赛传送门:Goodbye Jihai. \(\Huge{\mathbf{再见,己亥.\\你好,庚子!\\祝大家新春快乐!}}\) A. 新年的促销 这题如果直接做的话可能方向会想歪,方向对了其实就是 ...
- C语言数组成绩排序
#include<stdio.h> #define N 10 int main() { int s,i,j,tmp; int a[10]={78,56,38,99,81,86,39,100 ...
- c基本语法介绍
c语言基本语法介绍 1.把常量定义为大写字母形式,是一个很好的编程实践.
- 搜索await page.waitForSelector(allResultsSelector);
/** * Copyright 2017 Google Inc. All rights reserved. * * Licensed under the Apache License, Version ...
- 十八 JQuery&Ajax&Json&Xstream
JQuery 1 是什么?有什么用? JavaScript的代码类库 简化代码,提高效率.write less do more 1 JQuery与Servlet数据交互,load方式(少用) 语法:$ ...
- NO19 优化Linux系统--重要开机自启动服务--关闭自启动项
**如何优化Linux系统: 1 不用root,添加普通用户,通过sudo授权管理.2 更改默认的远程连接SSH服务端口及禁止root用户远程连接.3 定时自动更新服务器时间.4 配置 ...
- java.jvm调优
_amazing~ 基本: 整理:
- 整理jvm概念和原理详解以及gc机制
注:源代码就是.java文件,JVM字节码就是.class文件 1. Java 堆(Java Heap):(1)是Java虚拟机所管理的内存中最大的一块.(2)在虚拟机启动的时候创建.堆是jvm所有线 ...