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;
}
上一题
下一题