HDOJ-4311 Meeting point-1
2014-04-07 21:06
141 查看
由于前几天看到一道一维找最短距离点,那里是取中位数点为会面点,于是我一直在绕着找中位数,发现没法找,编程复杂度太高了。
可以预处理后可以枚举各点。
先按x排序,记录每一个点左右各点到其的距离和,有个递推公式。
再按y排序,同上处理。
然后枚举。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<string>
using namespace std;
typedef struct Point
{
long long x,y;
long long lx, rx, ly, ry;
}Point;
Point p[100001];
int n;
int cmpx(const void *a, const void *b)
{
Point *pa = (Point *)a;
Point *pb = (Point *)b;
return pa->x - pb->x;
}
int cmpy(const void *a, const void *b)
{
Point *pa = (Point *)a;
Point *pb = (Point *)b;
return pa->y - pb->y;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
int i,j;
for(i = 0; i < n; i++)
{
scanf("%I64d%I64d", &p[i].x, &p[i].y);
}
qsort(p, n, sizeof(p[0]), cmpx);
p[0].lx = p[n-1].rx = 0;
for(i = 1; i < n; i++)
p[i].lx = i * (p[i].x - p[i-1].x) + p[i-1].lx;
for(i = n - 2; i >= 0; i--)
p[i].rx = (n - i - 1) * (p[i+1].x - p[i].x) + p[i+1].rx;
qsort(p, n, sizeof(p[0]), cmpy);
p[0].ly = p[n-1].ry = 0;
for(i = 1; i < n; i++)
p[i].ly = i * (p[i].y - p[i-1].y) + p[i-1].ly;
for(i = n - 2; i >= 0; i--)
p[i].ry = (n - i - 1) * (p[i+1].y - p[i].y) + p[i+1].ry;
long long ans = p[0].lx + p[0].rx + p[0].ly + p[0].ry;
for(i = 1; i < n; i++)
{
long long tmp = p[i].lx + p[i].rx + p[i].ly + p[i].ry;
if(tmp < ans) ans = tmp;
}
printf("%I64d\n", ans);
}
return 0;
}
可以预处理后可以枚举各点。
先按x排序,记录每一个点左右各点到其的距离和,有个递推公式。
再按y排序,同上处理。
然后枚举。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<string>
using namespace std;
typedef struct Point
{
long long x,y;
long long lx, rx, ly, ry;
}Point;
Point p[100001];
int n;
int cmpx(const void *a, const void *b)
{
Point *pa = (Point *)a;
Point *pb = (Point *)b;
return pa->x - pb->x;
}
int cmpy(const void *a, const void *b)
{
Point *pa = (Point *)a;
Point *pb = (Point *)b;
return pa->y - pb->y;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
int i,j;
for(i = 0; i < n; i++)
{
scanf("%I64d%I64d", &p[i].x, &p[i].y);
}
qsort(p, n, sizeof(p[0]), cmpx);
p[0].lx = p[n-1].rx = 0;
for(i = 1; i < n; i++)
p[i].lx = i * (p[i].x - p[i-1].x) + p[i-1].lx;
for(i = n - 2; i >= 0; i--)
p[i].rx = (n - i - 1) * (p[i+1].x - p[i].x) + p[i+1].rx;
qsort(p, n, sizeof(p[0]), cmpy);
p[0].ly = p[n-1].ry = 0;
for(i = 1; i < n; i++)
p[i].ly = i * (p[i].y - p[i-1].y) + p[i-1].ly;
for(i = n - 2; i >= 0; i--)
p[i].ry = (n - i - 1) * (p[i+1].y - p[i].y) + p[i+1].ry;
long long ans = p[0].lx + p[0].rx + p[0].ly + p[0].ry;
for(i = 1; i < n; i++)
{
long long tmp = p[i].lx + p[i].rx + p[i].ly + p[i].ry;
if(tmp < ans) ans = tmp;
}
printf("%I64d\n", ans);
}
return 0;
}
相关文章推荐
- 文件遍历排序函数
- SQLSERVER的排序问题结果不是想要的
- 枚举的用法详细总结
- SQL学习笔记四 聚合函数、排序方法
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- SQL进行排序、分组、统计的10个新技巧分享
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)
- PHP下对数组进行排序的函数
- PHP 多维数组排序实现代码
- C#枚举中的位运算权限分配浅谈
- 修改正确的asp冒泡排序
- asp下几种常用排序算法
- JavaScript中数组的排序、乱序和搜索实现代码
- FileShare枚举的使用小结(文件读写锁)
- 枚举窗口句柄后关闭所有窗口示例
- Oracle 中文字段进行排序的sql语句
- PHP数组排序函数合集 以及它们之间的联系分析
- Array 重排序方法和操作方法的简单实例
- MYSQL 关于两个经纬度之间的距离由近及远排序
- 发个自己写的表格操作类(添加,删除,排序,上移,下移)