[题解] [AHOI2009] 跳棋
题面
题解
分类讨论, 考虑到只要所有的偶数点上都有棋子, 最左边的棋子就可以跳到最右边
题目第一问让我们求最少的在白格子上必须放的棋子数(不用考虑行动中放的棋子数)
考虑到这几种情况
- 有不少于两个红格子连起来, 那么他们可以一直在行动中放然后一直跳到任意一个格子, 那么行动前所需要的棋子数就是0, 但是要注意连着的两个红格子中不能有1, 因为1不是空的
- 一个白格子一个红格子, 那么在红格子上放一个棋子就可以用白格子上的棋子跳过去了, 代价是1
- 两个白格子, 直接在这个偶数点上放是最优的, 代价是1
把这几种情况看一下累加答案即可
第二问是让我们求在保证白格子上放的棋子尽量少, 红格子上放的棋子也尽量少
就是这个点能被红格子上的棋子跳到就让红格子去跳, 不能被红格子上的棋子跳到就放棋子
考虑到没有第一种情况就只能老老实实放在白格子上棋子了
所以白格子能被红格子上的棋子跳到当且仅当有不少于一个的第一种情况产生才行
如果只有一个第一种情况, 暴力更新即可
如果有多个, 题目转化为求某个点被跳到的最小代价
手玩发现第一种情况的代价是一个斐波那契数列, 从左往右更新一遍, 从右往左更新一遍即可
不懂看代码
Code
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define itn int
#define reaD read
#define N 1000
using namespace std;
int n, a[N];
long long ans1, ans2, f[N], INF;
inline int read()
{
int x = 0, w = 1; char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
}
int main()
{
n = read();
memset(f, 0x3f, sizeof(f));
INF = f[0];
for(int i = 1; i <= n; i++)
{
a[i] = read();
if(i != 1 && a[i]) f[i] = 1; //不少于两个红格子在一起才能够更新
}
for(int i = 2; i <= n; i++) f[i] = min(f[i], f[i - 1] + f[i - 2]); //从前往后跑一遍斐波那契
for(int i = n; i >= 2; i--) f[i] = min(f[i], f[i + 1] + f[i + 2]); //从后往前跑一遍斐波那契
//求出来的就是从两侧联通红格子到它的最小代价
for(int i = 2; i <= n; i += 2)
{
if(f[i] == INF) ans1++; //此白格子不能被覆盖, 选择直接放
else ans2 += f[i]; //可以覆盖, 加上代价
}
printf("%lld\n%lld\n", ans1, ans2);
return 0;
}
[题解] [AHOI2009] 跳棋的更多相关文章
- luoguP2039 [AHOI2009]跳棋 巧妙的dp
设\(f[i]\)表示在第\(i\)个格子上弄一个棋子的最小代价,前后扫两遍dp后统计答案即可. 代码 #include<bits/stdc++.h> using namespace st ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- 【题解】AHOI2009同类分布
好开心呀~果然只有不看题解做出来的题目才会真正的有一种骄傲与满足吧ヾ(๑╹◡╹)ノ" 实际上这题只要顺藤摸瓜就可以了.首先按照数位dp的套路,有两维想必是省不掉:1.当前dp到到的位数:2. ...
- 洛谷 题解 2165 [AHOI2009]飞行棋
本蒟蒻又来发题解了, 看到这个题目,本蒟蒻直接开始推公式.. 嗯,可以通过弧长,推出弦长(l = 2 * r * cos(90 * l / (r * Π)); 然后对比各条弦长的平方和与直径的平方. ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- 【题解】P1852 跳跳棋
link 题意 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.棋盘上有3颗棋子,分别在 \(a,b,c\) 这三个位置.我们要通过最少的跳动把他们的位置移动成 \(x,y, ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- 服务端相关知识学习(一)之什么是zookeeper
什么是zookeeper zookeeper是分布式协调服务,可以在分布式系统中共享配置.协调锁资源.提供命名服务那分布式协调服务又是个什么东西呢?首先我们来看“协调”是什么意思.在一个并发的环境里, ...
- HBuilderX 打包
新建 - 云打包 (密钥 密码看不到 - 回车) ( ) BlueStacks蓝叠 模拟器看效果
- yii2-cache组件第三个参数Dependency $dependency的作用浅析
用法如下: $cache->set($key, $result, Configs::instance()->cacheDuration, new TagDependency([ 'tags ...
- 用Python输出一个Fibonacci数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列” 用文字来说, ...
- python3中SYS模块
sys.argv 命令行参数List,第一个元素是程序本身路径sys.modules 返回系统导入的模块字段,key是模块名,value是模块sys.exit ...
- 通俗讲解python__new__()方法
目录 通俗讲解python__new__()方法 引子: 小结: 通俗讲解python__new__()方法 转载于别人的博客https://blog.csdn.net/sj2050/article/ ...
- 4G LTE 网只能提供数据服务,不能承载语音通话,该怎么理解?
转:http://www.qbiao.com/16776.html 这个问题要从移动核心网的角度来理解.我们平时说的WCDMA.TD-SCDMA.TD-LTE其实通常指空口技术,即从手机到基站的通信技 ...
- /proc/filesystems各字段含义
/proc/filesystems A text listing of the filesystems which were compiled into the kernel. Incidentall ...
- STM32WB HSE校准
通过改变RCC_HSECR寄存器中的HSETUNE[5:0]位域的值来校准HSE的输出频率 1.将HSE时钟配置为MCO模式输出到PA8引脚 HAL_RCC_MCOConfig(RCC_MCO1, R ...
- python学习笔记(三)条件判断和循环
1.条件判断语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: 1 2 3 4 5 6 7 8 9 age_of_cc = 27 age = int( ...