题意:
在一维坐标轴上有 n n n 个怪物在0坐标右边。你可以用炸弹炸任何一个位置,产生的效果是炸死这个位置的怪物,并且把所有在这个位置左边的怪物坐标左移 r r r 位,右边的怪物坐标右移 r r r 位,当怪物的坐标小于等于 0 0 0 时,怪物就会被陷阱杀死。
求最少用几个炸弹可以杀死所有的怪物。
二分答案,先把所有怪物排序,判断左边数第 n − m i d n−mid n−mid 个怪物能否在 m i d mid 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;
}