当前位置:网站首页>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;
}
边栏推荐
- 【Study Notes】Unused graph theory knowledge
- leetcode:373. 查找和最小的 K 对数字
- BAT "exclusive" Internet giant Android senior engineer interview questions: 174 questions allow you to do the interview
- 云原生 · 镜像详解
- 独家采访 | 智能源于自发产生而非计划:进化论拥趸,前OpenAI研究经理、UBC大学副教授Jeff Clune
- Flutter经验整理
- 【毕业设计】远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
- WPF 实现内阴影
- 沃土云创计划重磅来袭
- 【项目篇- 项目团队部分怎么写、如何作图?(两千字图文总结建议)】创新创业竞赛项目计划书、新苗国创(大创)申报书、挑战杯创业计划竞赛
猜你喜欢
Web3 Entrepreneur's Guide: How to Build a Decentralized Community for Your Product?
通过热透镜聚焦不同类型的高斯模式
EXCLUSIVE INTERVIEW | INTELLIGENCE IS SPONTANED, NOT PLANNED: Evolution Fan, Former OpenAI Research Manager and UBC Associate Professor Jeff Clune
Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
openEuler小程序会议指南
阿里云 Hologres助力好未来网校实时数仓降本增效
C# Call AutoNavi Map API to obtain latitude, longitude and positioning [Detailed 4D explanation with complete code]
What areas of the deep neural network are related to the human brain neural network?
leetcode:373. 查找和最小的 K 对数字
CCF大会腾源会专场即将召开,聚焦基础软件与开发语言未来发展
随机推荐
五、一起学习Lua 变量
HTM5学习:第一阶段02
Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
d,cast转换aa为右值
Analyzes how Flink task than YARN container memory limit
d包含区间
C-V2X八大误区澄清和发展辩思
Network Security - nmap
【毕业设计】老人心率脉搏血压体征监测手表 - stm32 单片机 嵌入式 物联网
a-upload上传图片去掉预览icon
Volatile关键字的作用
老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了
独家采访 | 智能源于自发产生而非计划:进化论拥趸,前OpenAI研究经理、UBC大学副教授Jeff Clune
六月成功案例
C语言,怪题小谈
StratoVirt 中的虚拟网卡是如何实现的?
2022 OceanBase 年度发布会:发布四大策略,迈入4.0时代
鸿海董事长刘扬伟:市场对智能手机和其他消费电子产品的需求正在放缓
爆赞!阿里P8首次分享出基于Docker的企业级Redis实战开源笔记
【黑马早报】抖音否认与头部主播签对赌协议;阿迪达斯CEO承认在中国犯了错;网易云社交App心遇被指涉黄;联通董事长称5G资费比点外卖还便宜