POJ-3244Difference between Triplets 公式转换
2016-08-05 11:48
113 查看
如果哪里有错,欢迎大牛指出!!
题意:给你多组数据,每组数据包含三个元素,两两不同数据求价值,即最大差减最小差,求多组数据的价值和。
题解:
可以将每组数据看成空间上的点x,y,z。两点之间的坐标差最大减最小为价值。
假设两组数据i,j。
其价值为v=max{ xi-xj , yi - yj , zi - zj } - min { xi-xj , yi - yj , zi - zj } ;
设a=xi-xj,b=yi - yj ,c=zi - zj;
v=max{ a , b , c } - min{ a , b , c };
此时将a,b,c看为数轴上的三个点。v就等于两端端点的距离,可以用(|a-b|+|b-c|+|c-a|)/2来求出v。
将a , b ,c 换回 x , y ,z。原公式:v=(|a-b|+|b -c|+|c-a|)/2=(|xi
- xj- yi + yj|+|yi - yj - zi + zj|+|zi - zj - xi + xj|)/2
设n=xi - yi , m=yi-zi , k=zi - xi , 即原问题为(| ni - nj | + | mi - mj | + | zi + zj |)/2;
此时需要将绝对值去掉,则进行从小到大排序。
判断第i项贡献了几次加法(在i之前的项),贡献了几次减法(在i之后的项)。
即i次加法,n-i次减法。
ac代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
long long x[200005],y[200005],z[200005];// 数据比较大,所以开大点
int main()
{
long long i,j,t,a,b,c;
while(scanf("%lld",&t)!=EOF&&t!=0)
{
j=0;
for(i=0;i<t;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
x[i]=a-b;
y[i]=b-c;
z[i]=c-a;
}
sort(x,x+t);//进行排序
sort(y,y+t);
sort(z,z+t);
for(i=0;i<t;i++)
{
j+=(x[i]+y[i]+z[i])*(i+i-t+1);// i次加法-(n-i)次减法,因为从0开始,所以加1;
}
printf("%lld\n",j/2);
}
return 0;
}
题意:给你多组数据,每组数据包含三个元素,两两不同数据求价值,即最大差减最小差,求多组数据的价值和。
题解:
可以将每组数据看成空间上的点x,y,z。两点之间的坐标差最大减最小为价值。
假设两组数据i,j。
其价值为v=max{ xi-xj , yi - yj , zi - zj } - min { xi-xj , yi - yj , zi - zj } ;
设a=xi-xj,b=yi - yj ,c=zi - zj;
v=max{ a , b , c } - min{ a , b , c };
此时将a,b,c看为数轴上的三个点。v就等于两端端点的距离,可以用(|a-b|+|b-c|+|c-a|)/2来求出v。
将a , b ,c 换回 x , y ,z。原公式:v=(|a-b|+|b -c|+|c-a|)/2=(|xi
- xj- yi + yj|+|yi - yj - zi + zj|+|zi - zj - xi + xj|)/2
对应到同一个点上就是(|(xi-yi)-(xj-yj)|+|(yi-zi)-(yj-zj)|+|(zi-xi)-(zj-xj)|)/2;
设n=xi - yi , m=yi-zi , k=zi - xi , 即原问题为(| ni - nj | + | mi - mj | + | zi + zj |)/2;
此时需要将绝对值去掉,则进行从小到大排序。
判断第i项贡献了几次加法(在i之前的项),贡献了几次减法(在i之后的项)。
即i次加法,n-i次减法。
ac代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
long long x[200005],y[200005],z[200005];// 数据比较大,所以开大点
int main()
{
long long i,j,t,a,b,c;
while(scanf("%lld",&t)!=EOF&&t!=0)
{
j=0;
for(i=0;i<t;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
x[i]=a-b;
y[i]=b-c;
z[i]=c-a;
}
sort(x,x+t);//进行排序
sort(y,y+t);
sort(z,z+t);
for(i=0;i<t;i++)
{
j+=(x[i]+y[i]+z[i])*(i+i-t+1);// i次加法-(n-i)次减法,因为从0开始,所以加1;
}
printf("%lld\n",j/2);
}
return 0;
}
相关文章推荐
- POJ 3244 Difference between Triplets 公式转换
- POJ 3244 - Difference between Triplets
- POJ 3244 - Difference between Triplets 公式,整合运算
- poj 1191 棋盘分割 公式转换,横纵方向动态规划
- poj 3244 Difference between Triplets——数学
- poj 3244 Difference between Triplets 最值公式推导
- poj 3244 Difference between Triplets
- (Relax 数论1.19)POJ 3244 Difference between Triplets(找规律..//公式max(a,b,c)-min(a,b,c)=(|a-b|+|b-c|+|a-c)
- POJ 1127 Jack Straws
- poj 2074 Line of Sight
- poj 2780 Linearity
- POJ 2243解题报告
- POJ 3260The Fewest Coins (DP)
- POJ 2258
- poj2236 Wireless Network
- POJ2480(欧拉函数求最大公约数之和)
- OpenJudge / Poj 1833 排列 C++
- Uva 10559 & POJ 1390 Blocks 区间dp
- poj 3080 Blue Jeans(最长公共子串)
- poj 3692 Kindergarten (最大团模板题)