Star Way To Heaven (prim最小生成树) // [ NOIP提高组 2014]飞扬的小鸟(DP)

文章目录

  • T1:Star Way To Heaven
    • 题目
    • 题解
    • 代码实现
  • T2:飞扬的小鸟
    • 题目
    • 题解
    • 代码实现

T1:Star Way To Heaven

题目

小 w 伤心的走上了 Star way to heaven。
到天堂的道路是一个笛卡尔坐标系上一个 n*m 的长方形通道 顶点在 (0,0) 和 (n,m) 。
小 w 从最左边任意一点进入,从右边任意一点走到天堂,最左最右的距离为 n,上下边界距离为m 。
其中长方形有 k 个Star ,每个 Star 都有一个整点坐标,Star 的大小可以忽略不计。
每个 Star 以及长方形上下两个边缘宇宙的边界都有引力,所以为了成功到达 heaven 小 w 离他们越远越好。
请问小 w 走到终点的路径上,距离所有星星以及边界的最小距离最大值可以为多少?

输入格式
一行三个整数n,m,k。
接下来 k 行,每行两个整数 表示一个点的坐标。
输出格式
一行一个数表示答案。保留到小数点后9位。

样例
样例输入
10 5 2
1 1
2 3
样例输出
1.118033989
数据范围与提示
对于 100% 的数据:k ≤ 6000;n,m ≤106

题解

以考虑二分答案result,对k个star都建一个半径为r的圆入手,
那么对于两个相交的圆把它们弄到一个集合,
对上下边界特殊判断,如果说上下边界被弄到了一个集合,
即说明,有若干个圆将矩形拦腰折断,分成了两个不连通的部分,是无法走到天堂的
则这个答案不合法,舍去

难道真的去搞二分?? 在这里插入图片描述
把几个圆弄到一个集合就会想到并查集,再到kruskal,最后联想到得到prim算法,
现将一个边界加入集合,找到距离它最小的点,加入集合,
将与之相连的点的距离更新

如此加边,知道另一边界也加入集合中,此时刚好上下界拦腰截断,其实这时的maxdis为恰好不能走过去时的最小dis,那么只要小一点点,就符合了,精度不用怕

代码实现

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXN 6005
#define LL long long
#define INF 10000000
int n, m, k;
double result;
double x[MAXN], y[MAXN], dis[MAXN];
bool vis[MAXN];double count ( int u, int v ) {return sqrt ( ( x[u] - x[v] ) * ( x[u] - x[v] ) + ( y[u] - y[v] ) * ( y[u] - y[v] ) );
}int main() {scanf ( "%d %d %d", &n, &m, &k );for ( int i = 1;i <= k;i ++ )scanf ( "%lf %lf", &x[i], &y[i] );for ( int i = 1;i <= k;i ++ )dis[i] = y[i];dis[k + 1] = m;for ( int i = 1;i <= k + 1;i ++ ) {int t = -1;double now = INF;for ( int j = 1;j <= k + 1;j ++ ) {if ( ! vis[j] && dis[j] < now ) {now = dis[j];t = j;}}result = max ( dis[t], result );if ( t == k + 1 ) return ! printf ( "%.9f", result * 0.5 );vis[t] = 1;for ( int j = 1;j <= k;j ++ ) {double tmp = count ( j, t );if ( ! vis[j] )dis[j] = min ( dis[j], max ( dis[t], tmp ) );}dis[k + 1] = min ( dis[k + 1], m - y[t] );}return 0;
} 

T2:飞扬的小鸟

题目

Flappy Bird是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。

为了简化问题,我们对游戏规则进行了简化和改编:
游戏界面是一个长为 n,高为 m 的二维平面,其中有 k 个管道(忽略管道的宽度)。
小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。

小鸟每个单位时间沿横坐标方向右移的距离为 1,竖直移动的距离由玩家控制。如果点击屏幕,小鸟就会上升一定高度 X,每个单位时间可以点击多次,效果叠加;如果不点击屏幕,小鸟就会下降一定高度 Y。小鸟位于横坐标方向不同位置时,上升的高度 XX 和下降的高度 Y 可能互不相同。
小鸟高度等于 0 或者小鸟碰到管道时,游戏失败。小鸟高度为 m 时,无法再上升。

现在,请你判断是否可以完成游戏。如果可以,输出最少点击屏幕数;否则,输出小鸟最多可以通过多少个管道缝隙。

输入格式
第 1 行有 3 个整数 n, m, k分别表示游戏界面的长度,高度和水管的数量,每两个整数之间用一个空格隔开;
接下来的 n 行,每行 22 个用一个空格隔开的整数 X 和 Y,依次表示在横坐标位置 0∼n−1 上玩家点击屏幕后,小鸟在下一位置上升的高度 X,以及在这个位置上玩家不点击屏幕时,小鸟在下一位置下降的高度 Y。
接下来 k 行,每行 33 个整数 P, L, H,每两个整数之间用一个空格隔开。每行表示一个管道,其中 P 表示管道的横坐标,L 表示此管道缝隙的下边沿高度,H 表示管道缝隙上边沿的高度(输入数据保证 P 各不相同,但不保证按照大小顺序给出)。

输出格式
共两行。
第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0。
第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数,否则,输出小鸟最多可以通过多少个管道缝隙。

输入输出样例
输入
10 10 6
3 9
9 9
1 2
1 3
1 2
1 1
2 1
2 1
1 6
2 2
1 2 7
5 1 5
6 3 5
7 5 8
8 7 9
9 1 3
输出
1
6

输入
10 10 4
1 2
3 1
2 2
1 8
1 8
3 2
2 1
2 1
2 2
1 2
1 0 2
6 7 9
9 1 4
3 8 10
输出
0
3
说明/提示
【输入输出样例说明】
如下图所示,蓝色直线表示小鸟的飞行轨迹,红色直线表示管道。
在这里插入图片描述
【数据范围】
对于 30%的数据:5≤n≤10,5≤m≤10,k=0,保证存在一组最优解使得同一单位时间最多点击屏幕 3次;
对于 50%的数据:5≤n≤20,5≤m≤10,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;
对于 70%的数据:5≤n≤1000,5≤m≤100;
对于 100%的数据:5≤n≤10000, 5≤m≤1000,0≤k<n, 0 < X < m, 0 < Y < m, 0 < P < n, 0≤L<H≤m, L + 1 < H

题解

考虑DP[i][j]DP[i][j]DP[i][j]:表示当鸟在(i,j)(i,j)(i,j)时点击屏幕的最少次数
1.鸟是从i-1掉下来的
DP[i][j]=DP[i−1][j+y[i]](j+y[i]≤m)DP[i][j]=DP[i-1][j+y[i]](j+y[i]≤m)DP[i][j]=DP[i1][j+y[i]](j+y[i]m)
2.鸟是前面i-1多次点击上来的
DP[i][j]=DP[i−1][j−x[i]∗k](j≥x[i]∗k)DP[i][j]=DP[i-1][j-x[i]*k](j≥x[i]*k)DP[i][j]=DP[i1][jx[i]k](jx[i]k)
此时思考时间复杂度O(nmk)O(nmk)O(nmk),肯定TLE
那么就可以将这种情况想成前面跳一次,然后自己往上竖直跳k-1次
DP[i][j]=min(DP[i−1][j−x[i]]+1,DP[i][j−x[i]]+1)DP[i][j]=min(DP[i-1][j-x[i]]+1,DP[i][j-x[i]]+1)DP[i][j]=min(DP[i1][jx[i]]+1,DP[i][jx[i]]+1)
3.注意当往上跳过m的时候,鸟就一直在m处往后飞
4.因为x可能会有限制水管,所以算完后把水管赋值成INF,就可以了


其实这道题就是一个很板的背包问题,加一点点优化就可以了
在这里插入图片描述

代码实现

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAXM 2005
#define MAXN 10005
#define INF 0x3f3f3f3f
int n, m, k;
bool flag[MAXN]; 
int x[MAXN], y[MAXN];
int low[MAXN], high[MAXN];
int dp[MAXN][MAXM];int main() {scanf ( "%d %d %d", &n, &m, &k );for ( int i = 1;i <= n;i ++ )scanf ( "%d %d", &x[i], &y[i] );for ( int i = 1;i <= k;i ++ ) {int P, H, L;scanf ( "%d %d %d", &P, &L, &H );flag[P] = 1;low[P] = L;high[P] = H;}memset ( dp, 0x3f, sizeof ( dp ) );for ( int i = 1;i <= m;i ++ )dp[0][i] = 0;for ( int i = 1;i <= n;i ++ ) {for ( int j = x[i] + 1;j <= m + x[i];j ++ )dp[i][j] = min ( dp[i - 1][j - x[i]] + 1, dp[i][j - x[i]] + 1 );for ( int j = m;j <= m + x[i];j ++ )dp[i][m] = min ( dp[i][m], dp[i][j] );for ( int j = 1;j + y[i] <= m;j ++ )dp[i][j] = min ( dp[i][j], dp[i - 1][j + y[i]] );if ( flag[i] ) {for ( int j = 1;j <= low[i];j ++ )dp[i][j] = INF;for ( int j = high[i];j <= m;j ++ )dp[i][j] = INF;}}int result = INF;for ( int i = 1;i <= m;i ++ )result = min ( result, dp[n][i] );if ( result < INF )printf ( "1\n%d", result );else {int i, j, tot = 0;for ( i = n;i >= 1;i -- ) {for ( j = 1;j <= m;j ++ )if ( dp[i][j] < INF )break;if ( j <= m )break;}for ( int j = 1;j <= i;j ++ )if ( flag[j] )tot ++;printf ( "0\n%d", tot );}return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1043E Train Hard, Win Easy

CF1043E Train Hard, Win Easy 题意&#xff1a; n个人有Ai和Bi两个属性&#xff0c;给出m个关系&#xff1a;xi yi表示xi和yi不能配对 i,j两人规定匹配的价值为min (Ai Bj , Bi Aj ) 回答出每个人跟所有人配对&#xff08;除开不能和自己匹配的人&#xff09;的价值总和 …

P7887-「MCOI-06」Existence of Truth【构造】

正题 题目连接:https://www.luogu.com.cn/problem/P7887?contestId52021 题目大意 给出三个长度为nnn的序列xi,yi,zix_i,y_i,z_ixi​,yi​,zi​&#xff0c;求一个序列aaa满足0≤ai<10970\leq a_i<10^970≤ai​<1097且 xi(∑j1iaj)yi(∑jinaj)≡zi(mod1097)x_i\lef…

IdentityServer4-客户端的授权模式原理分析(三)

在学习其他应用场景前&#xff0c;需要了解几个客户端的授权模式。首先了解下本节使用的几个名词Resource Owner&#xff1a;资源拥有者&#xff0c;文中称“user”&#xff1b;Client为第三方客户端&#xff1b;Authorization server为授权服务器&#xff1b;redirection URI&…

【做题记录】[NOIP2011 提高组] 观光公交

P1315 [NOIP2011 提高组] 观光公交 我们想在 \(k\) 次加速每一次都取当前最优的方案加速。 考虑怎样计算对于每一条边如果在当前情况下使用加速器能够使答案减少的大小。 如果当前到达某个点时已经有人在等待了&#xff0c;那么加速这个点以前的边能够让这个点下车的人距离减少…

[2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

文章目录T1&#xff1a;复读数组题目题解代码实现T2&#xff1a;路径计数机题目题解代码实现T3&#xff1a;排列计数机题目题解CODET1&#xff1a;复读数组 题目 有一个长为nk的数组&#xff0c;它是由长为n的数组A1,A2,…,An重复k次得到的。 定义这个数组的一个区间的权值为…

模板:(多重)哈希

前言 还在为不想写双哈希又怕哈希冲突挂掉发愁吗&#xff1f; 来这里&#xff0c;满足你的一切梦想&#xff01; 哈希还有模板&#xff1f; 其实就是把相关的函数和数组打包到一个结构体里 但是针心方便啊&#xff01;&#xff01;&#xff01; 如果想双哈希的话&#xff0c;定…

CF1183H Subsequences (hard version)

题意&#xff1a; 长度为n的字符串S&#xff0c;现在要找出k个不同的子序列&#xff0c;使得这些序列的总价值最低 一个序列的价值等于删去的字符长度&#xff08;空串也算子序列&#xff09; 1≤n≤100,1≤k≤1012 题解&#xff1a; 一看就是dp&#xff0c;我们先想想串a可…

P7888-「MCOI-06」Distinct Subsequences【dp】

正题 题目大意 给出一个长度为nnn的字符串aaa&#xff0c;求它的所有子序列的本质不同子序列个数。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 考虑每个子序列产生的贡献&#xff0c;为了防止算重我们一个只统计走子序列自动机上的边的子序列&#xff0c;也就是说对于TTT…

微软携手 Docker 打造 CNAB,分布式应用来了!

微软中国MSDN 前天Microsoft Connect(); 2018发布的众多最新科技&#xff0c;都让全球开发者惊艳不已。其中一项最令开发者瞩目并迫不及待——微软联合Docker发布了云本地应用捆绑包&#xff08;Cloud Native Application Bundle&#xff0c;以下简称CNAB&#xff09;&#xff…

9.4 模拟

前言 175分 60100150 T3和T4做的不好 T4没有理解题目的意思…qwq T3暴力似乎挂了… 但T1和T2还是不戳的 T1打表找规律的方法也许更为有效 考场 先看题。 药丸。。 T3、4甚至根本没有看懂… T1和T2也感觉挺玄乎的 有一种爆零的预感 8&#xff1a;10 先看T1 推了推似乎还是有…

P4135 作诗

P4135 作诗 题意&#xff1a; 给定 n 个不大于 c 的正整数 a1…an 和 m 组询问&#xff0c;每次问 [l,r] 中有多少个数出现正偶数次。 对于每次询问&#xff1a; 设上一个询问的答案为 ans&#xff08;第一个询问时 ans0&#xff09;&#xff0c;令L(lans)mod n1&#xff0c;…

[C++]试一试结构体struct node的构造函数

可直接点击跳转到构造函数处结构体概念定义结构体定义结构体及结构体变量结构体变量的特点成员调用成员函数调用结构体的构造函数Upd1Upd2Upd3结构体概念 在实际问题中&#xff0c;一组数据往往具有不同的数据类型。 例如&#xff1a;人口大普查时&#xff0c;需要记录每一个人…

CSP-S 2021 退役记

写的比较草率&#xff0c;但的确是真实感受。 10.23 回寝室前敲了一个 dinic 板子&#xff0c;觉得不会考。。。 10.24 8:00 起床&#xff0c;还好今天宿管不在&#xff0c;可以起的晚一点。 吃了早饭来机房颓废。 10:00 似乎考前反而不知道该如何复习了&#xff0c;翻了翻以前…

Ybtoj-排列计数【矩阵乘法,分块幂】

正题 题目链接:http://noip.ybtoj.com.cn/contest/596/problem/1 题目大意 TTT组询问给出nnn求有多少个nnn的排列满足第一个是111并且相邻的差不超过222。 1≤T≤106,1≤n≤1091\leq T\leq 10^6,1\leq n\leq 10^91≤T≤106,1≤n≤109 解题思路 考虑一下如果我们要不断向前填满…

[多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

文章目录T1&#xff1a;分数转换题目题解代码实现T2&#xff1a;Slow Path Finding Algorithm题目题解代码实现T3&#xff1a;切面包题目题解代码实现T1&#xff1a;分数转换 题目 Time limit: 1.5 seconds Memory limit: 512 megabytes 给定一个十进制小数&#xff0c;请你…

P3992 [BJOI2017]开车

P3992 [BJOI2017]开车 题意&#xff1a; 题解&#xff1a; 我们要先将问题转换 圈是车&#xff0c;x是加油站。红色部分为车移动的路线 数组a是车数量的前缀和 数组b是加油站的前缀和 而a[i]与b[i]的差的绝对值就是对应的红色路被走的次数 现在车发生位置移动&#xff0c;b数…

IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

上节IdentityServer4-客户端的授权模式原理分析&#xff08;三&#xff09;以对话形式&#xff0c;大概说了几种客户端授权模式的原理&#xff0c;这节重点介绍Hybrid模式在MVC下的使用。且为实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置打下…

9.05 模拟

文章目录前言考场复盘T2T4总结前言 290分 1003010060 整体来说还不错&#xff0c;没有挂分 但是T2应该可以拿到值域[1,000]的第二档写到60分的 一部分原因也是给T2的时间有点少 &#xff08;十分钟&#xff09; 本次第一次尝试了在考场上对拍 效果还是不错的&#xff0c;并不会…

李超线段树

李超线段树可以用来维护平面上的线段(但是要求 \(x\) 或 \(y\) 其中一维比较小&#xff0c;在 \(10^5\) 及以内)。 称一条线段能成为区间 \([l,r]\) 中的最优线段&#xff0c;当且仅当&#xff1a; 该线段的定义域完整覆盖了区间 \([l,r]\) &#xff1b; 该线段在区间中点处最…

2021牛客OI赛前集训营-树数树【树上启发式合并,堆】

正题 题目链接:https://ac.nowcoder.com/acm/contest/20107/C 题目大意 给出nnn个点的一棵树&#xff0c;求一个最长的序列使得数字互不相同且相邻编号节点的都是祖孙关系。 1≤n≤105,1≤T≤51\leq n\leq 10^5,1\leq T\leq 51≤n≤105,1≤T≤5 解题思路 wx,iw_{x,i}wx,i​表…