测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27720. 时空穿梭机(cycraft)

填空题 中等

题目描述

时空穿梭机(cycraft)

题目描述

随着游戏的深入进行,你也获得了很多的武器装备,每获取一件武器装备都需要付出一定的代价。假设有一个时间轴,其上记录了在某个时间点对应有一个武器装备,我们赋予每一个时间点 ti 时刻对应的武器装备 i 的威力值为 wi。此时你拥有一台时空穿梭机,可以在时间轴上任意穿梭,假设穿梭到时间点 t,定义t 时间点到 ti 时间点获取 i 武器装备的代价为|t-ti|*wi。请计算在哪个 t 时间点获取所有武器装备需付出的总代价最小,输出最小的总代价。获取每一件武器装备必须都从 t 时间点出发,返回 t 时间点的代价为 0;|t-ti|表示 t-ti 的绝对值。

输入

共 n+1 行,第一行一个正整数 n,表示武器装备总数,接下来 n 行,每行两个用空格分隔的整数,分别表示时间 ti 和该时刻对应的武器装备的威力值 wi。

输出

共 1 行一个整数,表示获取所有武器的最小代价。

样例输入

4

-1 7

0 2

7 3

3 4

样例输出

40

参考答案

#include<bits/stdc++.h> using namespace std; int getSum(vector < pair < int, int >>& nums, int mid) { int n = nums.size(); int sum = 0; for (int j = 0; j < n; ++j) { sum += abs(mid - nums[j].first) * nums[j].second; } return sum; } int main() { int n; cin >> n; vector < pair < int, int >> nums(n); for (int i = 0; i < n; ++i) { int time, w; cin >> time >> w; nums[i] = { time, w }; } int res; int left = - 1000; int right = 1000; while (left <= right) { int mid = left + (right - left) / 2; int sum1 = getSum(nums, mid); int sum2 = getSum(nums, mid + 1); if (sum1 < sum2) { res = sum1; right = mid - 1; } else { left = mid + 1; } } cout << res; return 0; }
上一题 下一题