A: 签到题。问你把所有的行星删掉的代价最少是多少。你可以执行以下两种操作
1:删除任意1个行星,代价是1
2:删除这一轨道的所有行星,代价是w。
思路:显然map存一下遍历,ans每次加上min(当前轨道的所有行星个数,w)即可!
inline void solve()
{
cin >> n >> w;
map<int, vector<int>> mp;
ll ans = 0;
for (int i = 1; i <= n; i ++ )
{
int x;
cin >> x;
mp[x].pb(i);
}
for (auto [x, v] : mp)
{
int k = v.size();
ans += min(k, w);
}
cout << ans << endl;
}
B : 感觉是货舱选址的变型,并不需要知乎上面的二分吧。
题意:有n个人在n个坐标ai上,每个人出门要是ti的时间打扮自己,问你所有人聚齐在一个地方的最短时间是多少。
思路:我们可以这样来理解这个打扮自己的时间ti,也就是我们其实是可以把自己的坐标迁移到ai-ti和ai+ti这两个地方。然后对于答案的求解,我们显示是要找到最左边的位置,和最右边的位置,然后在这个区间的位置就是最理想的位置了!
inline void solve()
{
cin >> n;
vector<int> a(n), t(n);
rep(i, 0, n) cin >> a[i];
int minn = 1e9, maxx = -1e9;
rep(i, 0, n)
{
cin >> t[i];
minn = min(minn, a[i] - t[i]);
maxx = max(maxx, a[i] + t[i]);
}
cout << 0.5 * (maxx + minn) << endl;
cout << fixed;//浮点数问题!
}