11146: 粉兔爱女装
时间限制: 1 Sec 内存限制: 128 MB
提交: 69 解决: 23
[提交] [状态] [讨论版] [命题人:admin]
题目描述
粉兔 AK 了 IOI,决定女装来庆祝一下!
粉兔邀请了 N 个同学一参加她的女装盛宴!他们所在的城市可以看成一个二维平面,第 i个同学的家位于 (xi,yi)。每个同学都从家里出发,赶往聚会地点。由于城市只有南北走向和东西的街道,所以他们能沿着与坐标轴平行的直线走。第 i 个同学走一个单位长度需要时间 。粉兔希望他们快点赶到,所以她想找一个聚会地点,使得所有人到这个地点的时间之和最短 。
时间紧迫,请你求出最短的总时间 。
输入
第一行,一个正整数 N。
下面 N 行,每行三个整数 xi,yi和 ti。
输出
输出一个数,表示最短的总时间。
注意:你可能需要考虑时间是否一定是整数。
样例输入
复制样例数据
4 1 2 3 2 3 2 -1 2 5 1 -6 1
样例输出
22
提示
可以把地点选在 (1,2)。
第 1 个同学 :3×(|1−1|+|2−2|)=0;
第 2 个同学: 2×(|2−1|+|3−2|)=4;
第 3 个同学:5×(|−1−1|+|2−2|)=10;
第 4 个同学:1×(|1−1|+|−6−2|)=8;
总时间为 0+4+10+8=22。
可以证明没有更优的方案。
对于 100%的数据, N≤200000,0<ti≤100,∣xi,yi∣≤10^9。
题意:确定一个平面点使得每个人到该点的时间最短
每个人走一个单位时间为t,可以理解为有t个人每人走一单位时间为1(当然是别的大佬想到的)
那么x,y分开计算,也就是分别求x,y的中位数
计算出中位数再相加减,就相当于直接用大值减去小值
代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn = 2e5+100;
struct node {
ll x, y, t;
} s[maxn];
ll tim[maxn];
bool cmp1(node a, node b) {
return a.x < b.x;
}
bool cmp2(node a, node b) {
return a.y < b.y;
}
int main() {
//freopen("out.txt", "r", stdin);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld%lld%lld", &s[i].x, &s[i].y, &s[i].t);
sort(s + 1, s + n + 1, cmp1);
ll ans = 0;
for (int i = 1; i <= n; i++)
tim[i] = s[i].t;
int l = 1, r = n;
while (l < r) {
ans += s[r].x - s[l].x;
tim[r]--;
tim[l]--;
if (!tim[r]) r--;
if (!tim[l]) l++;
}
sort(s + 1, s + n + 1, cmp2);
l = 1, r = n;
while (l < r) {
ans += s[r].y - s[l].y;
s[r].t--;
s[l].t--;
if (!s[r].t) r--;
if (!s[l].t) l++;
}
printf("%lld\n", ans);
return 0;
}