问题 D: 小k的硬币问题
题目描述
输入
接下来依次描述 T 组测试数据。对于每组测试数据:
第一行为两个整数 n,k,表示有n堆硬币,k为1则表示小k先拿,k为0则表示小k后拿。
接下来一行,有n个整数m1.....mn,表示每堆硬币的数量。
0<T<10,0<n<=1000,0<m<=10
输出
样例输入 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的硬币问题的更多相关文章
- 【BZOJ】3436: 小K的农场
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 938 Solved: 417[Submit][Status][Discuss ...
- BZOJ3436 小K的农场
Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...
- 洛谷P1993 小 K 的农场
题目描述 小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个 农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描 述: 农场 ...
- 2014.7.7 模拟赛【小K的农场】
3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...
- 小K的H5之旅-HTML的基本结构与基本标签
一.什么是HTML HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构 HTML文档主要包括三大部分:文档声明部分.<head>头部部 ...
- [51nod1457]小K vs. 竹子
小K的花园种着n颗竹子(竹子是一种茎部中空并且长得又高又快的热带植物).此时,花园中第i颗竹子的高度是hi米,并且在每天结束的时候它生长ai米. 实际上,小K十分讨厌这些竹子.他曾经试图去砍光它们,但 ...
- 【BZOJ3436】小K的农场(差分约束)
[BZOJ3436]小K的农场(差分约束) 题面 由于BZOJ巨慢无比,使用洛谷美滋滋 题解 傻逼差分约束题, 您要是不知道什么是差分约束 您就可以按下\(Ctrl+W\)了 #include< ...
- 51 nod 1456 小K的技术(强连通 + 并查集)
1456 小K的技术 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 苏塞克王国是世界上创新技术的领先国家,在王国中有n个城市 ...
- BZOJ_3436_小K的农场_差分约束
BZOJ_3436_小K的农场_差分约束 题意: 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形式描述 ...
随机推荐
- Linux C编程学习
C语言简介 简介 C语言具有控制特性较强.高效性.可移植性和强大的功能和灵活性."自由的代价是永远的警惕",C的简洁性与其丰富的运算符相结合,使其可能会编写出较难理解的代码.面向对 ...
- 关于softmax稳定性问题
因为softmax中指数函数,很容易超出计算机表达的最大值,所以采用分子分母同时乘N的方法,N一般为最大值.
- Android 如何生成jks签名文件
- 洛谷p3955 图书管理员(NOIP2017 t2)
蒟蒻的最后一篇pas题解...目前转c++ ing 回顾了一下,发现c++的string真的好繁啊(主要我这个蒟蒻太菜不会用) 还是pas的string操作简洁 做法 我这种蒟蒻不像别的dalao,懒 ...
- HDU-6705 Path
Description You have a directed weighted graph with n vertexes and m edges. The value of a path is t ...
- 【CF10D】LCIS(LCIS)
题意:求两个序列的LCIS n,m<=300,a[i]<=1e9 题意:O(n^2) O(n^3)的话设dp[i,j]为A终点为a[1..i]且B终点为b[j]的最大长度,分a[i]==b ...
- 前向渲染使用重叠Reflection Capture 造成的反射通道接缝问题
问题出现的条件: 使用UE4 4.16 使用Forward shading 使用多个Sphere Reflection Capture组件(有重叠的部分) 烘焙灯光后能看到明显的反射通道接缝 解决办法 ...
- 学习日记17,、、通过反射获取model实体属性display的值
本来是想到网上直接找个用的,但是找的一些都不是我想要的,然后就参考自己摸索写了一个 这里的UserModel是我自己定义的一个实体类,代码就不用放出来了 var t = typeof(UserMode ...
- idea创建项目和依赖
创建项目和依赖 项目搭建完成后打开web.xml可看到如图使用的是servlet2.3,但版本太老,servlet2.3 jsp 的el表达式不工作,所以我们需要切换新版本. 切换新版本方法:打开t ...
- 在 mac 系统上安装 python 的 MySQLdb 模块
在 mac 系统上安装 python 的 MySQLdb 模块 特别说明:本文主要参考了Mac系统怎么安装MySQLdb(MySQL-Python) 第 1 步:下载 MySQL-python-1.2 ...