1 条题解

  • 1
    @ 2026-4-26 12:59:55

    题解
    神奇药水
    题意
    有 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;
      }
    

    求赞,谢谢!

    信息

    ID
    2934
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    405
    已通过
    33
    上传者