1 条题解
-
1
题解
神奇药水
题意
有 n 个人参加实验。第 i 个人初始头发长度为 a_i 厘米,每过一天,所有人的头发都会增长 x 厘 米。
求最早在第几天,至少有 k 个人的头发长度严格超过 y 厘米。
注意:
第 0 天时,头发长度仍然是初始长度;
经过 d 天后,第 i 个人的头发长度为 a_i + d * x 。
思路
对于每个人,单独计算他最早在哪一天头发长度会严格超过 y 。
需要满足:
如果a[i]>y,那么第 0 天就已经满足。
否则:
d*x>y-a[i]
因为是严格大于,所以最小天数为:d=(y-a[i])/x+1 这里使用整数除法即可。
计算出每个人需要的天数后,排序,取第 k 小的天数,就是至少 k 个人满足条件的最早天数。k有可能大于n,需要与n取min否则会越界。
复杂度
时间复杂度: O(n log n)
空间复杂度: O(n)
参考代码#include <bits/stdc++.h> using namespace std; long long d[1000005]; int main() { // freopen("test1.in","r",stdin); int n, k; long long x, y; cin >> n >> k >> x >> y; for (int i = 1; i <= n; i++) { long long a; cin >> a; if (a > y) { d[i] = 0; } else { d[i] = (y - a) / x + 1; } } sort(d+1,d+1+n); k=min(k,n); cout << d[k] << '\n'; return 0; }求赞,谢谢!
- 1
信息
- ID
- 2934
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 405
- 已通过
- 33
- 上传者