LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating
LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating
【问题描述】
The cross-country skiing course at the winter Moolympics is described by an M x N grid of elevations (1 <= M,N <= 500), each elevation being in the range 0 .. 1,000,000,000.
Some of the cells in this grid are designated as starting points for the course. The organizers of the Moolympics want to assign a difficulty rating to each starting point. The difficulty level of a starting point P should be the minimum possible value of D such that a cow can successfully reach at least T total cells of the grid (1 <= T <= MN), if she starts at P and can only move from cell to adjacent cell if the absolute difference in elevation between the cells is at most D. Two cells are adjacent if one is directly north, south, east, or west of the other.
Please help the organizers compute the difficulty rating for each starting point.
滑雪场用一个M*N(1 <= M,N <= 500)的数字矩阵表示海拔高度,每个数字表示一个范围在0 .. 1,000,000,000的高度。有些格子被指定为起点,组织者想对这些起点做难度评级。
如果起点P点是一个难度级别为D的起点,则D必须是满足以下条件的一个最小值:
(1)从一个格子只能滑到相邻的格子;
(2)这两个格子的海拔差不超过D;
(3)至少能够到达T(1 <= T <= M*N)个格子(包括起点本身)。
【输入样例】
3 5 10
20 21 18 99 5
19 22 20 16 17
18 17 40 60 80
1 0 0 0 0
0 0 0 0 0
0 0 0 0 1
【输出样例】
24
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500 + 5;
const int maxm = maxn * maxn;
long long am[maxm], fa[maxm], is[maxm];
//am amount 集合子点数量 ,fa father 父节点编号 , is is_start 集合内的起点个数
long long he[maxn][maxn], id[maxn][maxn];
//he height (i,j)高度
long long n, m, t, cntv, sign, cnte;
//cntv count_vertex,cnte count_edge
struct edge
{
long long beg, to, len; // beg起点 , to 终点 ,len 边权
} a[1000000]; //血泪(必须要开1000000)
edge mk(long long x,long long y, long long z)
{
edge t = (edge)
{
x, y, z
};
return t;
}//这是一个制作边的函数
bool cmp(edge a, edge b)
{
return a.len < b.len;
}//这是一个将边排序的函数(服务于贪心思想)
long long find(long long x)
{
if(x == fa[x])return x;
else return fa[x] = find(fa[x]);
}//并查集标准find函数
void merge(int x, int y)
{
if(x < y)swap(x, y); fa[y] = x;
am[x] += am[y];
// am[y] = 0;
is[x] += is[y];
}//这是一个合并函数(维护了两个集合的子点数个数,起点个数)
int main()
{
scanf("%lld%lld%lld", &n, &m, &t); for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%lld", &he[i][j]);
cntv++;
id[i][j] = cntv;
//给坐标为(i,j)的点编号 cntv
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf("%lld", &sign); if(sign)is[id[i][j]] = 1;//这个点是一个起点 if(i < n)
{
a[++cnte] = mk(id[i][j], id[i + 1][j], abs(he[i][j] - he[i + 1][j]));
} if(j < m)
{
a[++cnte] = mk(id[i][j], id[i][j + 1], abs(he[i][j] - he[i][j + 1]));
} //建边
}
} sort(a + 1, a + 1 + cnte, cmp); //贪心 long long ans = 0; for(int i = 1; i <= maxm; i++)
{
am[i] = 1; //i是自己的一个集
fa[i] = i;
}
for(int i = 1; i <= cnte; i++)
{
int x = a[i].beg;
int y = a[i].to;
int z = a[i].len;
int fx = find(x);
int fy = find(y);
if(fx==fy)continue; if(am[fx] + am[fy] >= t)
{
if(am[fx] < t)ans += z * is[fx];
//如果一个集合的数目小于t,则其没有算过边。
if(am[fy] < t)ans += z * is[fy];
} merge(fx, fy);
} printf("%lld", ans);
return 0;
}
LGOJ3101 [USACO14JAN]滑雪等级Ski Course Rating的更多相关文章
- [USACO14JAN]滑雪等级Ski Course Rating
题目描述 The cross-country skiing course at the winter Moolympics is described by an M x N grid of eleva ...
- 【USACO2009 Open】滑雪课程ski
[USACO2009 Open]滑雪课程 Ski Lessons Time Limit: 1000 ms Memory Limit: 131072 KBytes Description 约翰请贝西去科 ...
- [USACO14JAN]Ski Course Rating G
题目链接:https://www.luogu.com.cn/problem/P3101 Slove 这题我们可以尝试建立一个图. 以相邻的两个点建边,边的权值为两个点高度差的绝对值,然后把边按照边权值 ...
- [USACO09OPEN]滑雪课Ski Lessons
题目描述 Farmer John wants to take Bessie skiing in Colorado. Sadly, Bessie is not really a very good sk ...
- BZOJ 1571: [Usaco2009 Open]滑雪课Ski
Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S& ...
- [bzoj1571][Usaco2009 Open]滑雪课Ski
题目描述 Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里,每天会提供S(0<=S<=100 ...
- 【贪心优化dp决策】bzoj1571: [Usaco2009 Open]滑雪课Ski
还有贪心优化dp决策的操作…… Description Farmer John 想要带着 Bessie 一起在科罗拉多州一起滑雪.很不幸,Bessie滑雪技术并不精湛. Bessie了解到,在滑雪场里 ...
- BZOJ——1571: [Usaco2009 Open]滑雪课Ski
http://www.lydsy.com/JudgeOnline/problem.php?id=1571 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- [USACO2009 OPEN] 滑雪课 Ski Lessons
洛谷P2948 看到题目就觉得这是动规但一直没想到如何状态转移……看了别人的题解之后才有一些想法 f[i][j]:前i单位时间能力值为j可以滑的最多次数 lessons[i][j]:结束时间为i,获得 ...
随机推荐
- gulp 打包安装
Ooo_My_God发表于2015-02-24 分类:构建工具 阅读(41103) 评论(166) 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行 ...
- kubectl命令小妙招
kubectl命令使用大全 中文: http://docs.kubernetes.org.cn/683.html [root@master-test ~]# kubectl --help kube ...
- U138097 小鱼吃大鱼 埃氏筛
题目描述 小P同学在养殖一种非常凶狠的鱼,而且与其他鱼类不同,这种鱼越大越温顺,反而小鱼最凶残.当两条鱼相遇时, 小鱼会不断撕咬大鱼,每一口都咬下与它自身等重的肉(小鱼保持体重不变),直到大鱼的体重小 ...
- Redis常用命令(2)——String
APPEND 格式:APPEND key value 作用:在key的键值后追加value,如果key不存在,则创建key,并存入value. 返回值:追加value后的字符串长度. 示例: 192. ...
- jupyter IPthon常用命令
Jupyter IPython 一.安装Anaconda 到官网下载Anaconda安装包 双击Anaconda3-5.0.0-Windows-x86_64.exe文件 会出现如下的页面 1. 点击i ...
- [Luogu P4147] 玉蟾宫 (网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P4147 Solution 裸的求极大子矩阵 感谢wzj dalao的教学 首先,有一个很显然但很重要的结论 ...
- Python爬虫简单实现CSDN博客文章标题列表
Python爬虫简单实现CSDN博客文章标题列表 操作步骤: 分析接口,怎么获取数据? 模拟接口,尝试提取数据 封装接口函数,实现函数调用. 1.分析接口 打开Chrome浏览器,开启开发者工具(F1 ...
- Lagrange插值C++程序
输入:插值节点数组.插值节点处的函数值数组,待求点 输出:函数值 代码如下:把printf的注释取消掉,能打印出中间计算过程,包括Lagrange多项式的求解,多项式每一项等等(代码多次修改,这些pr ...
- pip升级失败
python -m pip install --upgrade pip失败 解决办法: easy_install pip
- Linux系统下用户如何膝盖FTP用户密码
其实修改ftp用户密码与修改普通用户的密码的过程是一眼高的其具体步骤如下 1.用root账户登录系统 2.使用passwd命令修改密码: 第一次输入密码后提示:The password fails t ...