Codeforces 1238 B. Kill 'Em All(二分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意:

在一维坐标轴上有 n n 个怪物在0坐标右边。你可以用炸弹炸任何一个位置,产生的效果是炸死这个位置的怪物,并且把所有在这个位置左边的怪物坐标左移 r r 位,右边的怪物坐标右移 r r 位,当怪物的坐标小于等于 0 0 时,怪物就会被陷阱杀死。

求最少用几个炸弹可以杀死所有的怪物。

二分答案,先把所有怪物排序,判断左边数第 n m i d n−mid 个怪物能否在 m i d mid 次导弹下被炸到陷阱里。

AC代码:

const int N = 1e5 + 10;
int n, m;
int ans, res, pos;
int q, rr, x;
bool k[N];
int a[N], len;

bool cmp(int x, int y)
{
    return x < y;
}

int main()
{
    sd(q);
    while (q--)
    {
        len = 0;
        sdd(n, rr);
        mem(k, 0);
        rep(i, 1, n)
        {
            sd(x);
            if (!k[x])
            {
                k[x] = 1;
                a[++len] = x;
            }
        }
        sort(a + 1, a + len + 1, cmp);
        int l = 0, r = len;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            if (a[mid] - (len - mid) * rr <= 0)
            {
                ans = len - mid;
                l = mid + 1;
            }
            else
                r = mid - 1;
        }
        pd(ans);
    }
    return 0;
}
发布了728 篇原创文章 · 获赞 431 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/104821543