POJ 3244 Difference between Triplets 公式转换

2024-04-23 19:48

本文主要是介绍POJ 3244 Difference between Triplets 公式转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:两个三元组(x1,y1,z1)(x2,y2,z2)的距离如下定义

D = max {x1 − x2, y1 − y2, z1 − z2} − min {x1 − x2, y1 − y2, z1 − z2}

现在给你n个三元组,让你求出任意两个三元组的距离之和。

 

题解:公式转换非常有用,必须引起重视

先简化一下模型:

a = x1-x2, b=y1-y2, c=z1-z2

D = max {a,b,c} − min {a,b,c}

这样的话 D = (|a-b|+|b-c|+|c-a|)/2。在数轴上画一下即可看清楚

D = (|(x1-x2)-(y1-y2)|+|(y1-y2)-(z1-z2)|+|(z1-z2)-(x1-x2)|)/2

D = (|(x1-y1)-(x2-y2)|+|(y1-z1)-(y2-z2)|+|(z1-x1)-(z2-x2)|)/2

再令 a1=x1-y1, b1=y1-z1, c1=z1-x1

那么 D = (|a1-a2|+|b1-b2|+|c1-c2|)/2

到这一步其实还是比较难算的,因为绝对值不好去掉

由于每个三元组需要与其它n-1个三元组计算一次

那么每个a,b,c都要与其他三元组的a,b,c计算一次

那么不妨将所有的a,b,c排序

这样一来排在ai之前的a0,a1···都比ai小,那么ai就要贡献i+ai

而排在ai之后的所有值都比ai大,那么ai就要贡献n-1-i-ai

所以ai总的贡献是 [i-(n-1-i)] * ai = [i+i-n+1] * ai

对于b,c的计算同理。 

#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 200000
int a[MAXN], b[MAXN], c[MAXN];
int main()
{
int x, y, z, n;
while ( scanf("%d",&n) && n )
{
for ( int i = 0; i < n; i++ )
{
scanf("%d%d%d",&x,&y,&z);
a[i] = x-y;
b[i] = y-z;
c[i] = z-x;
}
sort(a,a+n);
sort(b,b+n);
sort(c,c+n);
__int64 ret = 0;
for ( __int64 i = 0; i < n; i++ )  //注意做乘法的时候数据超出int范围
{
ret += (i+i-n+1) * a[i];
ret += (i+i-n+1) * b[i];
ret += (i+i-n+1) * c[i];
}
printf("%I64d\n",ret/2);
}
return 0;
}


 

这篇关于POJ 3244 Difference between Triplets 公式转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929720

相关文章

LangChain转换链:让数据处理更精准

1. 转换链的概念 在开发AI Agent(智能体)时,我们经常需要对输入数据进行预处理,这样可以更好地利用LLM。LangChain提供了一个强大的工具——转换链(TransformChain),它可以帮我们轻松实现这一任务。 转换链(TransformChain)主要是将 给定的数据 按照某个函数进行转换,再将 转换后的结果 输出给LLM。 所以转换链的核心是:根据业务逻辑编写合适的转换函

工程文档CAD转换必备!在 Java 中将 DWG 转换为 JPG

Aspose.CAD 是一个独立的类库,以加强Java应用程序处理和渲染CAD图纸,而不需要AutoCAD或任何其他渲染工作流程。该CAD类库允许将DWG, DWT, DWF, DWFX, IFC, PLT, DGN, OBJ, STL, IGES, CFF2文件、布局和图层高质量地转换为PDF和光栅图像格式。 Aspose API支持流行文件格式处理,并允许将各类文档导出或转换为固定布局文件格

直接得到Json串,转换为字典

0.新创建一个json文件,把json串拷贝到里面 1.先通过MainBundle找到资源对应的路径 2.将文件转换为NSData 3.通过NSJSonSerization得到字典 NSString*fileName=[[NSBundle mainBundle] pathForResource:@"myJson" ofType:@"json"];           NS

如何通过示例将旧版 C# 转换为 C# 12

随着 C# 的不断发展,每个新版本都会引入强大的新功能,从而提高语言的功能和可读性。通过从旧版本的 C# 迁移到 C# 12,您可以获得更高效、更易于维护和更具表现力的代码。 由于代码库遗留、公司限制以及对旧语言功能的熟悉,许多开发人员仍在使用旧版本的 C#。升级似乎很困难,但现代版本的 C# 具有显著的优势,例如更好的性能、增强的功能和更高的安全性。 通过增量重构、试点项目和团队培训逐步

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

poj 3294(Life Forms) 2分+ 后缀数组

我曾用字符串hash写,但是超时了。只能用后最数组了。大致思路:用不同的符号吧字符串连接起来,构建后缀数组,然后2分答案,依次扫描后缀数组,看是否瞒住条件。 VIEW CODE #include<cstdio>#include<vector>#include<cmath>#include<algorithm>#include<cstring>#include<cassert>#

poj 2391 Ombrophobic Bovines (网络流)

这是一道很经典的网络流的题目。首先我们考虑假如我们的时间为无穷大。我们吧每个点拆成2个点 i和i' .。虚拟源点s和汇点t。对于每个点建边(s,i, a[i])  (i‘,t,ib[i]) 。 其中a[i]为给点有多少牛,b[i]为容量。i和j连通 建边 (i,j',inf);如果最大流==所有牛的个数,就可能装下所有的牛。那么现在我们考虑时间。假设最大时间为T.那么如果i到j的的最短时间>T

poj 1330 LCA 最近公共祖先

水题目。直接上代码了。 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章`代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地,利用代码为GitHub:https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接,并填写URL和Cookies 获取Cookies的步