问题 D: 小k的硬币问题

时间限制: 1 Sec  内存限制: 128 MB
提交: 21  解决: 5
[提交] [状态] [命题人:jsu_admin]

题目描述

小k和小p一起玩一个游戏,有n堆硬币,每人轮流拿硬币,每次可以拿走1~5枚硬币,(必须拿完前一堆硬币才能开始拿后面一堆硬币,如果当前这堆硬币只剩下一枚,那么此次机会只能拿一枚),谁拿走的硬币多则获胜,两个人都足够聪明,后拿的人有一次机会能够一次拿走当前这堆硬币,请问比赛的结果是什么。

输入

第一行包含一个整数 T,表示有 T组测试数据。
接下来依次描述 T 组测试数据。对于每组测试数据:
第一行为两个整数 n,k,表示有n堆硬币,k为1则表示小k先拿,k为0则表示小k后拿。
接下来一行,有n个整数m1.....mn,表示每堆硬币的数量。

0<T<10,0<n<=1000,0<m<=10

输出

如果小k能赢则输出1,平手则输出0,否则输出-1.

样例输入 Copy

4
1 1
10
5 0
9 9 3 5 6
6 0
1 1 1 1 1 1
2 1
10 1

样例输出 Copy

0
1
0
1

这道题要用到博弈论的思维来解答,先来分析每一堆硬币,数量为 1~10,当数量为 1 是,没法选择策略,只能拿 1 个,当数量为 2~5 时先选的人可以选择拿走 n-1 个,下 一堆硬币有优先选择权,也可以选择拿走 n 个,下一堆硬币后选,当数量为 6 时,只 有一种策略,就是拿走 5 个(因为拿走 5 个以下时,另一个人就能决定你下一堆硬币 的先后手,题目已经申明两个人都足够聪明),这是下一堆硬币先选,当数量为 7~10 的时候,可以选择拿走 n-6 个,此时对方只能拿走 5 个,然后自己拿走剩下的 1 个,


下一堆硬币后选,也可以直接拿走   5  个,让对方决定自己下堆硬币是先手还是后手。

因为考虑到一开始后手的人有一次一次性拿走一堆硬币的机会,所以以该角色进行倒 推(倒推的话,每个人在选择的时候都能看出自己之后怎么选才是最合适的),分为

4 个状态,该堆硬币有优先选择权,且有一次机会已经用过,2.该堆硬币没有优先选择 权,且一次机会已经用过,3.该堆硬币有优先选择权,且有一次机会,4.该堆硬币没有 优先选择权,且没有机会,保存每种状态下能拿到的最多的硬币数量。从后往前开始 逆推时,要考虑的如果有一次机会的话,可以通过这一次机会来改变自己下一堆硬币 的先后手,且如果是后手,对方只会选择让你拿到最少硬币的策略。当逆推结束是, 第二种状态能拿到的最多的硬币数量就是,后手这个角色能拿到的最多的硬币数量。

我的暴搜tle

 #include<stdio.h>
#include<string.h>
int a[];
int b[];
int m,n;
int sum = -;
//a,b
//a = 0,c = 1;
void dfs(int i,int c,int d,int temp){
// printf("%d ",c);
// printf("%d ",d);
// printf("%d ",a[i]);
//printf("%d ",temp);
if(i==m+)
{
if(n==){ if(c<d){
// printf("%d %d",c,d);
sum = ;
// i--;
return ;
}
else if(sum!=&&c == d)
{
sum = ;
// i-- ;
return ;
}
// i--;
return ;
}
else
{
if(c>d){
// printf("%d %d",c,d);
sum = ;
// i--;
return ;
}
else if(sum!=&&c == d)
{
sum = ;
// i-- ;
return ;
}
// i--;
return ;
} } if(a[i]==)
{
//temp 0 dy c dy !k
if(temp == ){ dfs(++i,c++,d,-temp),i--,c--,-temp;
return;
}
else{ dfs(++i,c,d++,-temp),i--,c,d--,-temp;
return;
}
//d[n]++,n = 1-n;
} else if(<=a[i]&&a[i]<=){
//1
// d[n]+=a[i]-1,d[1-n] +=1;
if(temp==) //a+=a[i] - 1 d += 1{
{ dfs(++i,c+=a[i] - , d += ,temp),i--,c-=a[i] - , d -= ;
//
dfs(++i,c+=a[i],d,-temp),i--,c-=a[i],d,-temp;
// d[n]+=a[i],n = 1-n;
return;
}
else{
dfs(++i,d+=a[i] - , c += ,temp),i--,d-=a[i] - , c -= ;
//
dfs(++i,d+=a[i],c,-temp),i--,d-=a[i],c,-temp;
return;
}
}
else if(a[i]==){
// d[n] += 5;
// d[1-n]++;
if(temp == ){
dfs(++i,c+=,d++,temp),i--,c-=,d--;
return;
}
else{ dfs(++i,d+=,c++,temp),i--,d-=,c--;
// i--
return;
}
}
else if(a[i]>=&&a[i]<=){
//
if(temp ==){ dfs(++i,c+=a[i]-+,d+=,-temp),i--,c-=a[i]-+,d-=,-temp;
//d[n] += a[i] - 6,d[1-n] += 5,d[n]+=1,n = 1-n;
//2
// i--;
dfs(++i,c+=,d+=a[i]-,temp),i--,c-=,d-=a[i]-;
// i--;
//d[n] += 5;
//2.1
// d[1-n] +=a[i] - 5;
dfs(++i,c+=,d+=a[i]-,-temp),i--,c-=,d-=a[i]-,-temp;
// i--;
return;
}
else if(temp ==){ dfs(++i,d+=a[i]-+,c+=,-temp),i--,d-=a[i]-+,c-=,-temp;
// i--;
// printf("%d",d);
//d[n] += a[i] - 6,d[1-n] += 5,d[n]+=1,n = 1-n;
//
dfs(++i,d+=,c+=a[i]-,temp),i--,d-=,c-=a[i]-;
// i--;
//d[n] += 5;
//2.1
// d[1-n] +=a[i] - 5;
if(m!=)
dfs(++i,d+=,c+=a[i]-,-temp),i--,d-=,c-=a[i]-,-temp;
//dfs(++i,d+=6,c+=a[i]-6,1-temp),i--,d-=6,c-=a[i]-6,1-temp;
// i--;
return;
}
//2.2
// d[1-n] +=a[i] - 5 -1,d[n]++,n = 1-n;
} }
int main(){
int t; scanf("%d",&t);
while(t--){
//分别为堆数
memset(a,,sizeof(a));
sum = -;
scanf("%d%d",&m,&n);
for(int i = ;i<=m;i++){
scanf("%d",&a[i]);
}
int temp = n;
dfs(,,,temp);
// for(int i = 1;i<=m;i++){
// if(a[i]==1)
// d[n]++,n = 1-n;
// else if(2<=a[i]&&a[i]<=5){
// //1
// b[n]+=a[i]-1,b[1-n] +=1;
// //2
// b[n]+=a[i],n = 1-n;
//
// }
// else if(a[i]==6){
// b[n] += 5;
// b[1-n]++;
//
// }
// else if(a[i]>=7&&a[i]<=10){
// //1
// b[n] += a[i] - 6,b[1-n] += 5,b[n]+=1,n = 1-n;
// //2
// b[n] += 5;
// //2.1
// b[1-n] +=a[i] - 5;
// //2.2
// b[1-n] +=a[i] - 5 -1,b[n]++,n = 1-n;
// }
//
// }
if(sum){
printf("1\n");
}
else if(sum==)
{
printf("0\n");
}
else if(sum ==-)
{
printf("-1\n");
}
}
}

问题 D: 小k的硬币问题的更多相关文章

  1. 【BZOJ】3436: 小K的农场

    3436: 小K的农场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 938  Solved: 417[Submit][Status][Discuss ...

  2. BZOJ3436 小K的农场

    Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...

  3. 洛谷P1993 小 K 的农场

    题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...

  4. 2014.7.7 模拟赛【小K的农场】

    3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...

  5. 小K的H5之旅-HTML的基本结构与基本标签

    一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构 HTML文档主要包括三大部分:文档声明部分.<head>头部部 ...

  6. [51nod1457]小K vs. 竹子

    小K的花园种着n颗竹子(竹子是一种茎部中空并且长得又高又快的热带植物).此时,花园中第i颗竹子的高度是hi米,并且在每天结束的时候它生长ai米. 实际上,小K十分讨厌这些竹子.他曾经试图去砍光它们,但 ...

  7. 【BZOJ3436】小K的农场(差分约束)

    [BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...

  8. 51 nod 1456 小K的技术(强连通 + 并查集)

    1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...

  9. BZOJ_3436_小K的农场_差分约束

    BZOJ_3436_小K的农场_差分约束 题意: 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述 ...

随机推荐

  1. java:类集框架conllection接口list,set

    类集中提供了以下几种接口: 1.单值操作接口:conllection,List,Set list和set是conllection接口的子接口 2.一对值的操作接口:Map 3.排序的操作接口:Sort ...

  2. [CF286C] Main Sequence

    问题描述 定义幸运数列: 空数列是幸运数列 如果 S 是幸运数列,那么 {r, S, -r} 也是幸运数列 (r > 0) 如果 S 和 T 都是幸运数列,那么 {S, T} 也是幸运数列 给定 ...

  3. 进行移动端rem适配

    (function (designWidth, maxWidth) { var doc = document, win = window; var docEl = doc.documentElemen ...

  4. 【微信小程序】基础组件--view text image

    组件的通用属性: id class style hidden bind* catch* data-* view 小程序基础组件,基本等于最常用组件,类似于HTML中的div.view用于构建页面骨架, ...

  5. React Native 之react-native-sqlite-storage

    npm 官网指导: https://www.npmjs.com/package/react-native-sqlite-storage 1. 执行: npm install react-native- ...

  6. python multiprocessing pool

    python 本身是不是单线程这个我真心搞不懂 但是我是来吐槽的: multiprocessing.Pool(precesses = 2) 这个语句曾经让我的内存爆满,死机不解释. 在重装 pytho ...

  7. Java语言基础(方法重载概述和基本使用)

    方法重载概述: 在同一个类中,允许存在一个以上的同名方法,只要他们的参数列表不同(即参数类型或者参数个数)即可. 方法重载特点: 1. 与返回值类型无关,只看方法名和参数列表 2. 在调用的时候,虚拟 ...

  8. 最大 k 乘积问题 ( 经典区间DP )

    题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...

  9. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  10. windows及linux下 golang开发环境配置

    windows环境: 1.系统以及软件包版本: OS: windows 8.1  64位  x64处理器 GO:安装包:go1.7.3.windows-amd64.mis IDE:压缩包:liteid ...