粉兔爱女装 思维

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

题意:确定一个平面点使得每个人到该点的时间最短

每个人走一个单位时间为t,可以理解为有t个人每人走一单位时间为1(当然是别的大佬想到的)

那么x,y分开计算,也就是分别求x,y的中位数

计算出中位数再相加减,就相当于直接用大值减去小值

代码:

#include 

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;
}

 

你可能感兴趣的:(ACM)