[题解] [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 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- 这是一个用于判断IE浏览器版本的紧凑脚本
这是一个用于判断IE浏览器版本的紧凑脚本IE浏览器,不管它们是什么版本,总是与Web标准有些不兼容.对于编码人员来说,这很困难.为了考虑IE的兼容性,不管它是写CSS还是写JS,IE通常都会被特殊处理 ...
- Json-server在Vue 2.0中使用--build文件中没有dev-server文件
跟大佬的视频使用json-server模拟后台数据调用,发现build文件中并没有dev-server.js. 新版的vue-cli取消了dev-server.js和dev-client.js 改 ...
- Windows环境用Xampp自制证书(certificate), Chrome(版本 60.0.3112.90通过)
标题: Self signed certificate no longer valid as of Chrome 58(Chrome58以后自制证书不再有效)原文地址: https://github. ...
- C# Winform 带水印提示输入框
using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms ...
- qunee 流动的关系
<!DOCTYPE html> <html> <head> <title>Hello Qunee for HTML5</title> < ...
- Linux:fdisk
fdisk [-l] 装置名称 选项与参数: -l:输入后面接的装置所有的partition内容.若仅有fdisk -l时,则系统将会把整个系统内能够搜寻到的装置的partition均列出来 fdis ...
- springboot自动装备date类型报错问题
错误消息: Field error in object 'user' on field 'birthday': rejected value [2001-02-14]; codes [typeMism ...
- OJ问题集合
1.找出给定数组之中的3个和为0的数. 2.给出一个字符串,给出需要去除的字符串,返回去除需要去除的字符串后的值. 3.一个数组之中的第二最大值三个数的组合.
- Hdu 1564 1*2矩阵覆盖棋局博弈
n*n的矩阵如果n为偶数 则可被1*2的矩形完全覆盖 如果n为奇数 则除起点外 其他各自可被1*2矩形完全覆盖 所以当n为偶数 先手赢 n为奇数 后手赢 #include<bits/stdc++ ...
- Cookie/Session的机制
Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...