【USACO2006 Mar】 滑雪缆车 skilift

Time Limit 1000 ms
Memory Limit 131072 KBytes

Description

科罗拉多州的罗恩打算为奶牛建造一个滑雪场,为此要在山上规划一条缆车线路。

整座山可以用一条折线来描述,该折线有N个拐点,起点是1,终点是N。每个拐点的高度为Hi,相邻两个拐点之间的水平距离都是1。

缆车线路必须从起点开始修建,结束于终点。中间可以选择一些拐点安放缆绳的支柱,安全标准有两点:第一,缆绳的跨度有限制——相邻支柱的水平距离不能超过K;第二,缆绳的高度有限制——两根支柱之间的钢丝视作笔直的,在这座山的任何位置,钢丝都不能低于山的高度,但允许缆绳紧贴在山坡上或恰好穿过某个山峰。支柱相对于拐点的高度不计。

为了节约,罗恩希望修建的支柱越少越好,请帮他规划一下吧!当然,起点和终点上是一定要修建支柱的。

Input

第一行:两个用空格分开的整数:N和K,2 ≤ N ≤ 5000,1 ≤ K ≤ N − 1

第二行到N + 1行:第i + 1行有一个整数Hi,0 ≤ Hi ≤ ${10^9}$

Output

第一行:单个整数,表示最少需要修建的支柱数量

Sample Input

13 4
0
1
0
2
4
6
8
6
8
8
9
11
12

Sample Output

5

Hint

样例解释:支柱设在 1、5、7、9、13 号点处是最优方案。如果只设在 1、5、9、13 上,那么5 到9 就会有钢丝低于山坡的高度。如果只在 1、7、13 上修建,虽然高度符合要求,但这两段支柱的水平距离都超过了K。

Solution

身为菜鸡,打算再写一道dp

这道题的状态还是较容易设计的,即f[i]表示到第i个拐点所需设置的最少支柱数

那么一看数据范围,2000!!!!!!!!!!!

这就可以放心地乱搞写转移方程了

只要在前面的拐点中找到水平距离小于等于k且在这两个拐点之间所有拐点都不会插♂断这条缆绳的拐点,在这些拐点中求min(f[j])再加上改点即可

然后挂方程:$f[i] = \min \left\{ {\left. {f[j]} \right\}} \right. + 1,{\rm{1}} < = j < = i - 1$且j满足以上条件

那么我们现在就只剩下最后一个问题,如何判断缆绳不会被插♂断呢?

我们可以先做一个预处理,以(0,0)为坐标原点,把每个拐点写成一个点,显然,如果两个点之间没有点可以把缆绳插♂断,那么这两个点的所在的直线的斜率一定比前面那个点到两点之间每个点的斜率都要大

我们只需要用一个bool数组$b\left[ i \right]\left[ j \right]$来记录下第i个拐点是否能够达到第j个拐点

这样就能完美解决这道题了OwO

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
bool b[][];
int f[],a[];
double x=1e-;
bool check(double a,double b){return abs(a-b)<=x;}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<=n;i++){
double lim=-2147483640.0;
for (int j=i+;j<=n;j++) {
if (check(lim,1.0*(a[j]-a[i])/(j-i))||lim<=1.0*(a[j]-a[i])/(j-i)) b[i][j]=true;
lim=max(lim,1.0*(a[j]-a[i])/(j-i));
}
}
f[]=;
for (int i=;i<=n;i++){
f[i]=;
for (int j=;j<=i-;j++)
if (b[j][i]&&i-j<=k) f[i]=min(f[i],f[j]+);
}
printf("%d",f[n]);
return ;
}

【USACO2006 Mar】滑雪缆车 skilift的更多相关文章

  1. [BZOJ1659][Usaco2006 Mar]Lights Out 关灯

    [BZOJ1659][Usaco2006 Mar]Lights Out 关灯 试题描述 奶牛们喜欢在黑暗中睡觉.每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的 ...

  2. Bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 单调栈

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 631  Solved: 445[Submi ...

  3. BZOJ1657: [Usaco2006 Mar]Mooo 奶牛的歌声

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 489  Solved: 338[Submi ...

  4. 1657: [Usaco2006 Mar]Mooo 奶牛的歌声

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 526  Solved: 365[Submi ...

  5. bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 树形dp

    题目链接 bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 题解 dp[i][j][0 / 1] 以i为根的子数中 相邻点对选了j个的最大价值 代码 #i ...

  6. 1722: [Usaco2006 Mar] Milk Team Select 产奶比赛

    1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 https://www.lydsy.com/JudgeOnline/problem.php?id=1722 分析 ...

  7. [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈裸题)

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 961  Solved: 679[Submi ...

  8. [BZOJ1721][Usaco2006 Mar]Ski Lift 缆车支柱

    Description Farmer Ron in Colorado is building a ski resort for his cows (though budget constraints ...

  9. luogu 4909 [Usaco2006 Mar]Ski Lift 缆车支柱 动态规划

    可以出模拟赛T1? #include <bits/stdc++.h> #define N 5002 #define inf 1000000 #define setIO(s) freopen ...

随机推荐

  1. HP下kafka的实践

    kafka 简介 Kafka 是一种高吞吐量的分布式发布订阅消息系统 kafka角色必知 producer:生产者. consumer:消费者. topic: 消息以topic为类别记录,Kafka将 ...

  2. L2-014. 列车调度(带图详解)

    L2-014. 列车调度   火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选 ...

  3. PAT 1125 Chain the Ropes

    Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fo ...

  4. codeforces round #394 (div. 2) A\B 题解

    开始啦~ 始まった T1 #include <stdio.h> int l,r,even,odd; void Jud(){ for(int i=1;i<=200;i++){ for( ...

  5. Linux & Filesystem Hierarchy Standard

    Linux & Filesystem Hierarchy Standard The Filesystem Hierarchy Standard of Linux https://zhuanla ...

  6. [luoguP3252] [JLOI2012]树(DP)

    传送门 树上前缀和. 在树上找一条权值和为 s 的链,其中这个链上的点按深度递增(递减)(不同) dfs 每搜到一个点求它的前缀和 sum[x],放入 set 中. 在 set 中找 sum[x] - ...

  7. 常州模拟赛d8t1 友好数对

    分析:其实就是问你有多少对a,b有且仅有两位不相同.我们可以先枚举这两位,对应ai枚举一位,对应bi枚举一位,如果ai^(1<<x) == bi^(1<<y),证明恰好有两位不 ...

  8. 【Java基础】Java基本数据类型与位运算

    1.赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明确的,已命名 ...

  9. 欧拉回路输出(DFS,不用回溯!)Watchcow POJ 2230

    Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8109   Accepted: 3551   Special Judge D ...

  10. C - How Many Tables 并查集

    Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to kn ...