求调站外水题
  • 板块学术版
  • 楼主__er
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/16 09:59
  • 上次更新2023/10/27 07:19:11
查看原帖
求调站外水题
713955
__er楼主2022/10/16 09:59

题目描述

在一条公路两旁,散布着 nn 个小区,小区里有若干个学龄儿童。但这条路上还没有学校,现准备在这条路上的任选一点(可以和小区重合,也可以不重合)建学校,使得所有学生走的路程最短。

输入格式 第1行:一个整数 nn1<=n<=1000001 <= n <= 100000),表示公路两旁小区的数量。 接下来的 nn 行,每行 22 个整数 aia_ibib_i,分别表示小区的位置(将公路看成起点为0的一条数轴)和小区里学龄儿童的人数。

输出格式 一个数,表示所有学生走的最小的路程之和。

样例输入

5
1 2
10 4
20 3
30 5
40 2

样例输出

168

提示

学校选建在 2020 这个位置,所有学生走的路程和为:19×210×410×520×216819×2+10×4+10×5+20×2=168,这个路程和是最短的。

#include <bits/stdc++.h>
#define int long long
#define JS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;

struct Node {
	int p, q, num;
} a[100001];

bool cmp(Node x, Node y) {
	return x.num < y.num;
}
int n, tmp, t, sum;

signed main() {
	JS;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].p >> a[i].q;
		a[i].num = a[i].p * a[i].q;
	}
	sort(a + 1, a + 1 + n, cmp);
	if (n % 2 == 0) {
		t = a[n / 2].p;
	}
	if (n % 2 == 1) {
		t = a[n / 2 + 1].p;
	}
	for (int i = 1; i <= n; i++) {
		\\cout << abs(t - a[i].p) << " * " << a[i].q << endl << sum << endl << endl;
		sum += abs(t - a[i].p) * a[i].q;
	}
	cout << sum;
	return 0;
}

25pts,我连膜你赛T2都切不掉了(???)

2022/10/16 09:59
加载中...