[题解] [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 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- C# 定义热键
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Qt 中使用Java代码获取安卓设备的MAC地址(安卓9.0)
public String GetDeviceMAC() { String strMacAddr = null; try { // 获得IpD地址 InetAddress ip = getLocalI ...
- 深入Java虚拟机之内存区域与内存溢出
一.内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方 ...
- CentOS 7.6 64位安装docker并设置开机启动
步骤如下 安装docker.docker-compose yum -y install docker-io docker-compose 启动docker service docker start 设 ...
- jeesite 跳开登录页面直接访问
把控制层的${adminPath}改为${frontPath} 访问时吧/a改为/f 也可以在jeesite配置文件内配置两个的值 http://localhost:8181/cxfvp/a?logi ...
- REST easy with kbmMW #1
kbmMW 5.0支持REST服务器的开发,并且非常简单,下面看看如何实作一个REST服务器. 首先我们制作一个服务器应用程序,增加一个简单的Form,并放置kbmMW组件. 在Delphi中单击Fi ...
- IIS出现Server Error in '/' Application 错误的解决办法
C:\Windows\Temp"文件夹加上 IIS_IUSRS的权限
- inputrc命令
问题:搭建ubuntu系统后,输入命令的第一个字符+上页按键,发现不能找到历史命令,找了好久才发现是因为/etc/inputrc没有对键盘映射的上页键和下页键进行设置. 解决方法: 修改文件/etc/ ...
- 8.2.ZooKeeper应用场景
7.ZooKeeper应用举例 为了方便大家理解ZooKeeper,在此就给大家举个例子,看看ZooKeeper是如何实现的他的服务的,我以ZooKeeper提供的基本服务分布式锁为例. 7.1 分布 ...
- Problem C Shopping 闭环贪心
#include <bits/stdc++.h> using namespace std; ; int fa[maxn]; int main(){ int n, m; scanf(&quo ...