问题 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个),以下列三种形式描述 ...
随机推荐
- 《扩展和嵌入python解释器》1.4 模块方法表和初始化函数
<扩展和嵌入python解释器>1.4 模块方法表和初始化函数 1.4 模块方法表和初始化函数 下面,我演示如何从Python程序调用spam_system().首先,我们需要在’方法 ...
- P4716 【模板】最小树形图
题意 说一下我对朱刘算法的理解: 首先我们考虑树形图的性质:每个点除了根节以外都含有一条入边. 因此我们可以有一个贪心的想法:对每个点(除了根节点)找到一条最短的入边,但是这样会出现环,如下图: 我们 ...
- vue组件样式scoped
1.vue组件中的样式如果没加scrped,样式代表的是全局样式(避免组件之间样式的冲突).加了属性代表是模块化的. 其他组件引用button组件 上面分析了单个组件渲染后的结果,那么组件互相调用之后 ...
- 岭回归、lasso
参考:https://blog.csdn.net/Byron309/article/details/77716127 ---- https://blog.csdn.net/xbinwor ...
- mysql TOP语句 语法
mysql TOP语句 语法 作用:用于规定要返回的记录的数目. 语法:SELECT column_name(s) FROM table_name LIMIT number 说明:对于拥有数千条记录的 ...
- A标签跳转链接并修改样式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Internet History, Technology, and Security(week1)——History: Dawn of Electronic Computing
前言: 第一次进行课程学习,在反复观看视频和查找字典翻译理解后选出了视频中个人认为较重要的概念,以下并不按照逐句翻译,中文概括大意余下自由发挥,对老师想要告诉我们的历史有一个初步的了解,顺便锻炼以下英 ...
- spring学习笔记之---IOC和DI
IOC和DI (一)IOC (1) 概念 IOC (Inverse of Control) 反转控制,就是将原本在程序中手动创建对象的控制权,交给spring框架管理.简单的说,就是创建对象控制权被反 ...
- C++ 对象间通信框架 V2.0 ××××××× 之(二)
公共头文件:ss_type_def.h ================================================================================ ...
- lambda匿名函数和内置函数
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式 定义函数(普通方式) def func(arg): return arg + 1 执行函数 result = fun ...