CF1614B Divan and a New Project
题目大意
在一条街上,盖 栋楼,每栋楼坐标为 ,满足 且 是一个整数。
将所有楼从 到 标号。
有一人在编号为 的楼,分别要去编号为 的建筑 次,这个人往返编号为 的建筑一趟花费的时间为 。
请安排每一栋楼的坐标,使得这个人花费的时间最短。
共 组数据。
对于 的数据,保证 。
解题思路
首先,我们把编号为 的楼的坐标定为 方便去做。
记答案为 ,则 。
要使得 最少,就要让 大的楼放到距离 近的地方。
那么按照 从大到小排序,在 按照左右左右左右…的顺序放楼即可。
具体实现见代码。
时间复杂度 。
CODE
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int _ = 2e5 + 7;
int t;
int n;
struct abc
{
int v, id;
} a[_];
int b[_];
int ans;
bool cmp(abc a, abc b)
{
return a.v > b.v;
}
signed main()
{
scanf("%lld", &t);
while (t--)
{
ans = 0;
scanf("%lld", &n);
for (int i = 1; i <= n; ++i)
scanf("%lld", &a[i].v), a[i].id = i;
sort(a + 1, a + n + 1, cmp);
int k = 0;
for (int i = 1; i <= n; i += 2)
{
b[a[i].id] = ++k;
}
k = 0;
for (int i = 2; i <= n; i += 2)
{
b[a[i].id] = --k;
}
for (int i = 1; i <= n; ++i)
{
ans += 2 * a[i].v * abs(b[a[i].id]);
}
cout << ans << "\n";
cout << "0 ";
for (int i = 1; i <= n; ++i)
cout << b[i] << " ";
cout << "\n";
}
return 0;
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122078