当前位置:网站首页>2021牛客暑期多校训练营5 J Jewels
2021牛客暑期多校训练营5 J Jewels
2022-08-11 11:34:00 【Here_SDUT】
题意
有n个宝藏在一片三维的海中,每秒可以用钩子捞起一个,每个宝藏有一个垂直向下落的速度,问如何拿使得钩子伸出的距离的平方最小。
分析
每秒只能捞一个,一个宝箱只能在某一秒被捞起,且每秒可以捞任意一个宝箱,每个宝箱也可以在任意秒被捞起,将秒当做左部,宝藏当做右部,边权就是这一秒捞起这个宝藏钩子需要伸出的距离。求最小权匹配即可,用KM算法,将边权取反后计算就算最小值,然后输出时再取反即可,要用bfs的km算法,可以达到O(n^3)。
代码
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e5+10;
const double PI = acos(-1.0);
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
#define IO ios::sync_with_stdio(false)
typedef unsigned long long ull; //卡精度
const int N = 607; //最多图的点数
const int mod = 1e9 + 7;
const LL INF = 0x3f3f3f3f3f3f3f3f; //若求最小权值匹配,应该为-1e9+7;
LL w[N][N]; //边权
LL la[N], lb[N]; //左、右部点的顶标
bool va[N], vb[N]; //访问标记,是否在交错树中
int match[N]; //右部点匹配的左部点(一个只能匹配一个嘛)
int n;
LL delta;
int p[N];
LL c[N];//Y中所有不在交错树中的点对于所有在交错树中的X的误差的最小值
void bfs(int x) {
int a, y = 0, y1 = 0;
//y记录交错树中最后加入的Y点
for (int i = 1; i <= n; ++i) p[i] = 0, c[i] = INF;
match[y] = x;
do {
a = match[y], delta = INF, vb[y] = true;
for (int b = 1; b <= n; ++b) {
if (!vb[b]) {//不在交错树中的Y点
if (c[b] > la[a] + lb[b] - w[a][b])//计算最新的误差
c[b] = la[a] + lb[b] - w[a][b], p[b] = y;//y是最新加入交错树的点
if (c[b] < delta) //还是取最小的
delta = c[b], y1 = b;//直接记录最小值对于的Y点
}
}
for (int b = 0; b <= n; ++b)
if (vb[b])//交错树中的点
la[match[b]] -= delta, lb[b] += delta;
else//交错树外的点
c[b] -= delta;
y = y1;//y更新成相应的值
} while (match[y]);//如果y点没有匹配则找到增广路
while (y) match[y] = match[p[y]], y = p[y];//增广路取反
}
LL KM() {
for (int i = 0; i <= n; ++i) match[i] = la[i] = lb[i] = 0;
for (int i = 1; i <= n; ++i) {//对每个点求一次匹配
for (int j = 0; j <= n; ++j) vb[j] = false;//重新建立增广路
bfs(i);
}
LL res = 0;
for (int y = 1; y <= n; ++y) //若匹配失败w[match[y]][y]=INF;
if(match[y]) res += w[match[y]][y];
return res;
}
int main(int argc, char const *argv[]) {
cin >> n;
LL ans = 0;
for (int i = 1; i <= n; i++) {
LL x, y, z, v;
cin >> x >> y >> z >> v;
ans += x * x + y * y;
for (int j = 0; j < n; j++) {
w[i][j+1] = -pow(z + v * j, 2);
}
}
cout << ans - KM() << endl;
return 0;
}边栏推荐
- Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
- 或命名“狙击手” 长安全新皮卡申报图
- AWS、Splunk和Symantec牵头成立OCSF开放网络安全架构框架
- 小目标绝技 | 用最简单的方式完成Yolov5的小目标检测升级!
- 目标检测学习笔记——paddleDetection使用
- 2022 OceanBase 年度发布会:发布四大策略,迈入4.0时代
- [Study Notes] Maximum matching of general graphs
- 黑马瑞吉外卖之分类信息的分页查询
- Flutter 教程之 在 Flutter 中生成 JSON 模型,在 Flutter GetX 中过滤列表和延迟搜索
- B端产品需求分析与优先级判断
猜你喜欢
![C# Call AutoNavi Map API to obtain latitude, longitude and positioning [Detailed 4D explanation with complete code]](/img/39/75a32a787c4e85026a768fd5781f25.png)
C# Call AutoNavi Map API to obtain latitude, longitude and positioning [Detailed 4D explanation with complete code]

WPF 实现内阴影

《长津湖》和《三十而已》,不及王一博赚钱?

同城是美团电商的解法吗?

2022 OceanBase 年度发布会:发布四大策略,迈入4.0时代

MySQL之JDBC编程增删改查

C语言,怪题小谈

OpenHarmony如何选择图片在Image组件上显示(eTS)

Small target stunt | Complete the small target detection upgrade of Yolov5 in the easiest way!

Grid 布局介绍
随机推荐
Volatile关键字的作用
requestAnimationFrame的应用
如何在游戏中实现一场下雨效果
【毕业设计】老人心率脉搏血压体征监测手表 - stm32 单片机 嵌入式 物联网
十九、一起学习Lua 垃圾回收
六、一起学习Lua 循环
如何批量下载hugging face模型和数据集文件
从零开始配置 vim(12)——主题配置
关于数据权限的设计
从零开始配置 vim(11)——插件管理
网络安全——nmap
Typora表格中常用操作
PG--核心技术--HOT
rem如何使用
SM5200原厂SOT23-6 500mA 线性锂电子替代芯片
darknet 结构体汇总
【Study Notes】Unused graph theory knowledge
Five minutes to teach you intranet penetration
B端产品需求分析与优先级判断
Jmeter性能测试