5.10 省选模拟赛 拍卖 博弈 dp
LINK:拍卖
比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了。
随便设了一个状态 就开始做了。
果然需要认真的思考。其实 从我的状态的状态转移中可以看出所有的结论。
这里 就不再赘述我那个爆零代码了.
一下把 有价值的东西简称为1 无价值的东西简称为 0
结论1:容易想到 答案一定是0,1串。考虑证明 当不存在k这个限制的时候 在先手 两次拿到1之间 后手一定可以拿到一个1 否则后手就拿先手的第二个1.
考虑存在k的时候 到达k之前有Vf>=Vs 如果此时前面的都选了 那么和上述局面一样。
如果没有选够 若此时Vf+1==Vs 那么此时必然后手为先手 那么根据上述局面 后手此时最多比先手多1 然后和之前抵消掉就变成0了。
反之 还是先手为先手 那么和上述局面一致。
所以先手最多比后手多拿1个.
结论2:显然先手不会拿0物品 那么那样转换先后手了 且自己价值没有增加且局面更差.
结论3:先手遇到1就会拿 如果没有拿 那么跟刚才的局面一样 且自己的价值降低了 拿的话局面不会比不拿差.
至此可以得到先手的策略 有1就拿遇到0就跳。
不需要得到后手的策略 因为只有先手拿过 后手才能拿 且此时后手变成先手。
当存在有k的情况 我们已知了 先手一定拿1遇到0跳过 此时 后手有拿0的机会且局面不会更差。
如果后手有一个不拿0 那么其实答案可以直接计算出来 即 到达k时前面的1的个数的奇偶性。
但是 可能后手有可能拿0 此时就是博弈问题了 我们不知道后手究竟拿不拿0.
一个dp 设f[i][j]表示对于[i,n]k值为j的胜者是先手还是后手0/1。对于先手的胜利显然为Vf-Vs=1 对于后手的胜利显然为Vf-Vs=0.
这样 利用刚才的先手的策略很容易退出状态转移方程. 暴力dp 就得到了40 points.
const int MAXN=5010;
int n,Q;
int f[MAXN][MAXN];
char a[MAXN];
int main()
{
//freopen("1.in","r",stdin);
gt(n);gt(Q);gc(a);
fep(n,1,i)
{
rep(1,n-i+1,j)
{
if(a[i]=='1')f[i][j]=f[i+1][j-1]^1;
else
{
if(j==n-i+1)f[i][j]=f[i+1][j-1];
else f[i][j]=min(f[i+1][j-1],f[i+1][j]);
}
}
}
rep(1,Q,i)put(f[1][read()]);
return 0;
}
由于状态是01 可以利用bitset来进行优化。
这样可以获得60 points.
const int MAXN=100010;
int n,Q;
char a[MAXN];
bitset<MAXN>s;
int main()
{
//freopen("1.in","r",stdin);
gt(n);gt(Q);gc(a);
fep(n,1,i)
{
if(a[i]=='1')s=(s<<1).flip(),s[0]=0;
else
{
int ww=s[n-i];
s=(s<<1)&s;
s[n-i+1]=ww;
}
}
rep(1,Q,i)
{
int x;gt(x);
int ww=s[x];
put(ww);
}
return 0;
}
100分的话需要利用平衡树来优化这个过程 不过我不太会写.
先咕了.
5.10 省选模拟赛 拍卖 博弈 dp的更多相关文章
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式
LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...
- 4.3 省选模拟赛 序列游戏 dp
可以发现 某一段被删除后状态难以表示 也难以链接起来. 考虑暴力 有40分的状压dp 暴力存状态 然后枚举转移即可.最后注意和f[0]这个状态取max 不然一分都没有. const int MAXN= ...
- 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...
- 5.12 省选模拟赛 T2 贪心 dp 搜索 差分
LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
随机推荐
- 前端工程化的的理解,浅谈web工程化的开发流程
1. 什么是前端工程化 自有前端工程师这个称谓以来,前端的发展可谓是日新月异.相比较已经非常成熟的其他领域,前端虽是后起之秀,但其野蛮生长是其他领域不能比的.虽然前端技术飞快发展,但是前端整体的工程生 ...
- 线性动归之Wooden Sticks
题面:现在有n(n<5000)个木头,每个木头都有长度l和重量w(l<10000,w<10000),现在你要对木头进行加工: 1.第一根木头需要先花费1min: 2.加工完第i跟木头 ...
- 用Serverless Kubernetes为.NET (Core)应用保驾护航
前言 容器化对现在(0202年)来说,已经不算是什么新东西了,老黄最近也在公司推动这一块的发展,有幸落地了几个项目,有.NET Core的,也有.NET Framework的. 容器化现在主流的就是d ...
- 深入Mybatis源码——执行流程
前言 上一篇分析Mybatis是如何加载解析XML文件的,本篇紧接上文,分析Mybatis的剩余两个阶段:代理封装和SQL执行. 正文 代理封装 Mybatis有两种方式调用Mapper接口: pri ...
- Mysql基础(八):MySQL 表的一对一、一对多、多对多问题
将实体与实体的关系,反应到最终数据库表的设计上,将关系分为三种:一对一,一对多(多对一)和多对多,所有的关系都是表与表之间的关系; 一对一 一对一:一张表的一条记录只能与另外一条记录进行对应,反之亦然 ...
- SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等
Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...
- idea 安装 codota 插件
为抄代码而生的插件哇,码农们的知心姐姐!!!
- vue : 对 vue-class-component 的个人理解
vue-class-component 是 vue 的官方库,作用是用类的方式编写组件. 这种编写方式可以让.vue文件的js域结构更扁平,并使vue组件可以使用继承.混入等高级特性. 简单的示例: ...
- Vue使用定时器定时刷新页面
1. 需求说明 在前端开发中,往往会遇到页面需要实时刷新数据的情况,给用户最新的数据展示. 2. 逻辑分析 如果需要数据实时更新,我们自然是需要使用定时器,不断的调用接口数据,会相对的消耗内存. 3. ...
- eclipse GIT本地库分支操作
git分支是一个重要的知识点,平时我们开发主要结合eclipse,idea来操作,今天这贴主要以eclipse来操作git本地库分支,主要内容包括新建分支,切换分支,合并分支,冲突解决,重命名分支,删 ...