NKOJ 2770 难度系数(最小生成树)
P2770【USACO 2014 January Gold】难度系数
问题描述
奶牛冬奥会的越野滑雪场可以被看做是一个M x N(1 <= M,N <= 500)的网格区域。其中每格都有一个海拔高度(海拔高度的范围:0 .. 1,000,000,000)。其中一些格子被设计成了滑雪的起点,赛会组织者想要给每个滑雪起点做一个难度的评级。
一个起点P的难度系数D应该尽可能小,使得一只奶牛能够成功的滑过至少T(1 <= T <= MN)个格子。如果奶牛从P出发,它只能朝相邻的格子滑行,且要求相邻的格子的海拔高度差的绝对值不超过D。请帮助组织者计算出每个起点的难度系数。
输入格式
第一行,三个整数M, N, 和 T
接下来是一个M x N的整数矩阵,表示每个格子的海拔高度
接下来是一个M x N的矩阵,矩阵由数字0和1构成,数字1表示该处是一个起点。
输出格式
一个整数,表示所有起点的难度系数总和(可能超过int范围)
样例输入
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
首先我们要理解一个起点的难度系数是指:从该起点出发经过的相邻的两点的高度差的最大值。
同时我们注意到每个点是可以反复经过的,并且反复经过不会影响难度系数。
因此我们可以发现,对于一个起点,它最后经过的所有的点必然是一个联通块。我们定义两点之间的边的权值等于他们的高度差。那么一个起点的难度系数就是它所在联通块中最大的边权。
我们考虑将所有的边按照权值从小到大排序,将Kruscal算法修改一下。
每次选出权值最小的边,合并它连接的两个联通块,如果合并后的大联通块包含的点数大于等于T,并且小联通块各自包含的点数小于T,那么ans+=小联通块中起点数*当前边的权值。
正确性是显然的。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define Abs(a,b) ((a>b)?(a-b):(b-a))
#define N 505
#define M 500005
using namespace std;
struct node{int x,y,z;}edge[M];
bool cmp(node a,node b)
{return a.z<b.z;}
int m,n,t,map[N][N],Map[N][N],id[N][N],F[M],size[M],p[M],tot,TOT,cnt;
long long ans;
int GF(int v)
{if(F[v]!=v)F[v]=GF(F[v]);return F[v];
}
int main()
{int i,j,x,y,k;scanf("%d%d%d",&m,&n,&t);for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&map[i][j]);for(i=1;i<=m;i++)for(j=1;j<=n;j++){scanf("%d",&Map[i][j]);cnt+=Map[i][j];//cnt表示起点总数}for(i=1;i<=m;i++)for(j=1;j<=n;j++){id[i][j]=++tot;size[tot]=Map[i][j];//size记录起点数}for(i=1;i<=m;i++)for(j=1;j<=n;j++){if(i!=m){TOT++;edge[TOT].x=id[i][j];edge[TOT].y=id[i+1][j];edge[TOT].z=Abs(map[i][j],map[i+1][j]);}if(j!=n){TOT++;edge[TOT].x=id[i][j];edge[TOT].y=id[i][j+1];edge[TOT].z=Abs(map[i][j],map[i][j+1]);}}sort(edge+1,edge+TOT+1,cmp);for(i=1;i<=tot;i++)F[i]=i,p[i]=1;//p记录总点数i=1;while(cnt&&i<=TOT){x=GF(edge[i].x);y=GF(edge[i].y);if(x!=y){if(p[x]+p[y]>=t){if(p[x]<t)ans+=1ll*size[x]*edge[i].z,cnt-=size[x];if(p[y]<t)ans+=1ll*size[y]*edge[i].z,cnt-=size[y];}F[x]=y;size[y]+=size[x];p[y]+=p[x];}i++;}cout<<ans;
}
NKOJ 2770 难度系数(最小生成树)相关推荐
- P2770【USACO 2014 January Gold】难度系数
问题描述 奶牛冬奥会的越野滑雪场可以被看做是一个M x N(1 <= M,N <= 500)的网格区域.其中每格都有一个海拔高度(海拔高度的范围:0 .. 1,000,000,000). ...
- 2021年高考英语卷三成绩查询,2021年全国3卷高考外语卷难不难,今年全国3卷高考外语卷难度系数点评...
2020年全国3卷高考外语试卷高考命题大纲,与2018年.2019年全国3卷外语卷相比,在考核目标.考试范围与要求等方面基本没有大的变化,增加了一些细节要求和知识点的考察,所以2020年全国3卷高考外 ...
- 区块链和java哪个更难_java 区块链中设计合理的难度系数
难度系数的概念 区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易.难度系数越高,相应越难.例如比特币的难度系数是18. 难度系数一般是hash值的前置0的个数. java 区 ...
- access统计班级人数_7省新高考选科统计出炉!学科难度系数排行再度爆冷
多年以来,中国实行的高考政策普遍是3+X模式,即三大学科:数学.英语.语文, X则指的是理科或者文科. 新高考改革中,部分省份采用的模式变成了3+3模式,也就是不分文理科,除过三门必选科目之外,可以从 ...
- java定义文章的难度系数
本文定义文章的难度系数为:平均句长难度系数+常用字难度系数. 思路: (1)统计文章中.!?的数量来确定句子数,句子数除以总字符数即为平均句长,即可得到一个测评标准(句长): (2)保存一个常用500 ...
- 高尔夫球场难度系数_在高尔夫球场上表现出色
高尔夫球场难度系数 I'd need wider columns to hold my golf scores, but this Excel template for golf scores mig ...
- java实现区块链中的区块hash难度系数的设计
区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易.难度系数越高,相应越难.例如比特币的难度系数是18. 难度系数一般是hash值的前置0的个数. java 区块链中设计合理的 ...
- java和区块链哪个难_java 区块链中设计合理的难度系数
区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易.难度系数越高,相应越难.例如比特币的难度系数是18. 难度系数一般是hash值的前置0的个数. java 区块链中设计合理的 ...
- 计算机类专业学习难度排行,全国33所名校计算机专业考研跨考难度系数排名
计算机系统结构前20名(总共47所高校) 1.清华大学,2.华中科技大学,3.西安交通大学,4.上海交通大学,5.浙江大学,6.西安电子科技大学,7.武汉大学,8.复旦大学,9.哈尔滨工业大学,10. ...
最新文章
- linux系统编程需要什么,若想成为一名Linux下编程高手,必须能对各种系统调用有透彻的了解...
- python2和python3分别是python的两个版本_Windows下Python2与Python3两个版本共存的方法详解...
- Spring mvc PostgreSQL 插入timestamp和int8
- easyui 中combogrid 实现多选,反选效果
- js里面字符数字和数字相加_「译」5 个奇怪的只会在 JS 里才发生的趣事
- 从零开始配置服务器密码机的开发环境
- 防止误删的神器-ECS实例删除保护
- 基于JAVA+SpringBoot+Mybatis+MYSQL的旅游信息管理系统
- logback日志配置文件
- 100位量子计算机算力,量子算力争霸再迎赛点:谷歌称瞄准新纪录!
- Android 加载Webview链接类型的Youtube视频
- matlab 质心,Matlab中三点确定质心
- SpringCloud 统一网关Gateway -- 为什么需要网关、Gateway快速入门、路由断言工厂(Route Predicate Factory)
- The server encountered an internal error that prevented it from fulfilling this request.解决方法
- 微信小程序开发案例分享-必背诗:从0到1,从前端到数据库
- GIC spec之ITS和LPI中断1
- matlab他励直流电机,他励直流电机制动过程的MATLAB分析
- python降低图片分辨率_手把手:扫描图片又大又不清晰?这个Python小程序帮你搞定!...
- 【STM32F411RE和L610物联网入门学习笔记】
- DataOps、MLOps 和 AIOps,你要的是哪个Ops?