题意
有一个无限大的集合,其中包含了 1 到正无穷之间的所有数。现在有一个长度为 n 的数组,要对集合进行如下操作 k 次:
删去集合中第 ai 小的数字。
问最终集合中最小的数字是多少。
思路
可以发现一个数 x,如果在操作一次之后没有被删去的话,那么一定能在数组中找到一个位置 i,满足x > ai。然后 x 就变成了 x−i。
那么从位置 1 反向模拟回去,模拟 k 次就可以找到答案了。
令 答案ans=1, 步长 cnt=0,如果 ans+cnt>=ai,那么说明在这一步中有数字会被删去,此时 cnt 还要+1。
int a[N];
void solve()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int ans = 1;
int cnt = 0, r = 1;
while(k--) {
while(r <= n && ans + cnt >= a[r]) {
cnt++;
r++;
}
ans += cnt;
}
cout << ans << "\n";
}
大佬,x变成了x - i是什么意思?
我这里写的不太清楚,具体意思你可以这样类比:
一开始 x 在 1 ~ n 的序列中,位置是 x ,x 前面删掉了 i 个数以后,x 的位置就变成了 x - i