洛谷 P3073 [USACO13FEB]拖拉机Tractor
时间:2019-09-11
本文章向大家介绍洛谷 P3073 [USACO13FEB]拖拉机Tractor,主要包括洛谷 P3073 [USACO13FEB]拖拉机Tractor使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
洛谷 P3073 [USACO13FEB]拖拉机Tractor
Description
FJ有块农田太崎岖了,他要买一辆新拖拉机才能在这里巡视。这块农田由N x N个格子的非负整数表示高度(1<=N<=500)。拖拉机从当前格子走到相邻格子(东、南、西、北四个方向)的代价为高度差D,则FJ驶过这两个格子的拖拉机最少也要值D块钱。
FJ愿意花足够的钱买一辆新的拖拉机使得他能以最小的高度差走遍所有格子的一半(如果格子总数是奇数,那么一半的值为四舍五入的值)。因为FJ很懒,所以他找到你帮他编程计算他最小需要花多少钱买到符合这些要求的拖拉机。
Input
第一行为一个整数N
第2到N+1行每行包含N个非负整数(不超过1,000,000),表示当前格子的高度。
Output
- 共一行,表示FJ买拖拉机要花的最小价钱。
Sample Input
5 0 0 0 3 3 0 0 0 0 3 0 9 9 3 3 9 9 9 3 3 9 9 9 9 3
Sample Output
3
题解:
- 最小生成树。
- 首先每个格子都跟它周围的格子建边。然后将边权从小到大排序依次加入。每加入一条边后,判断是否有集合里的元素超过了一半格子数。如果超过了,直接输出这条边的权即可。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 505
#define M (500 * 500 * 2)
using namespace std;
struct E {int u, v, w;} e[M];
int n, tot, cnt, ans;
int fat[N * N], size[N * N];
int a[N][N];
int cal(int x, int y) {return (x - 1) * n + y;}
bool cmp(E x, E y) {return x.w < y.w;}
int getFat(int x)
{
if(x == fat[x]) return x;
return fat[x] = getFat(fat[x]);
}
int main()
{
cin >> n, tot = n * n / 2;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
int x = i, y = j + 1;
if(x >= 1 && x <= n && y >= 1 && y <= n)
{
e[++cnt].u = cal(i, j);
e[cnt].v = cal(x, y);
e[cnt].w = abs(a[i][j] - a[x][y]);
}
x = i + 1, y = j;
if(x >= 1 && x <= n && y >= 1 && y <= n)
{
e[++cnt].u = cal(i, j);
e[cnt].v = cal(x, y);
e[cnt].w = abs(a[i][j] - a[x][y]);
}
}
for(int i = 1; i <= n * n; i++)
fat[i] = i, size[i] = 1;
sort(e + 1, e + 1 + cnt, cmp);
for(int i = 1; i <= cnt; i++)
{
int fx = getFat(e[i].u), fy = getFat(e[i].v);
if(fx == fy) continue;
if(size[fx] > size[fy]) swap(fx, fy);
size[fy] += size[fx], fat[fx] = fy;
if(size[fy] >= tot) {cout << e[i].w; break;}
}
return 0;
}
原文地址:https://www.cnblogs.com/BigYellowDog/p/11505418.html
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- 我的WCF之旅(4):WCF中的序列化[下篇]
- [WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]
- Android EclipseIDE技巧
- 什么是编译错误,运行时错误及逻辑错误?
- 我的WCF之旅(4):WCF中的序列化[上篇]
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
- 微信年度重磅“小游戏”上线,罗胖一度退出的小程序正在逆袭
- 谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
- Android注解学习(1)
- [WCF权限控制]ASP.NET Roles授权[上篇]
- [WCF权限控制]ASP.NET Roles授权[下篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Delta Lake 学习笔记(三)
- 4.IP地址与子网划分
- 08-软考的法律条文
- Intellij IDEA必备插件,提高效率的“七种武器”!
- Mongodb分页查询优化下
- MySQL 案例:大表改列的新技巧(Generated Column)
- Spark 2.2 on K8S Dynamic Resource Allocation
- Java中异常处理的9个最佳实践
- Mongodb执行计划
- Spark 2.2/2.3/2.4 的 Dynamic Resource Allocation
- 04-操作文件与目录
- 05-命令的使用
- 缓存穿透、缓存击穿、缓存雪崩看这篇就够了,文末还送福利哦!
- 百万并发「零拷贝」技术系列之经典案例Netty
- 什么是大O表示法