现有一包含 � n 个数的序列 � 1 , � 2 , � 3 , . . . , � � A 1 ,A 2 ,A 3 ,...,A n ,给定一个定值 � k. 每次我们可以选择数列中一个下标为 2 的次幂的元素(如 � 1 , � 2 , � 4 , � 8 . . . A 1 ,A 2 ,A 4 ,A 8 ...) 将其删除出数列(删除后,其后的所有元素会自动前移一格)。 问最少进行多少次操作,能将序列中所有值为 � k 的元素删除?给出c/c++代码
时间: 2023-06-09 13:04:42 浏览: 78
您好,根据您的要求,我为您提供以下解答和代码。
解答:我们可以使用贪心的思想,从最高位开始判断。若当前位为1,则可以将其删除,然后继续考虑下一个高位上的数字。若当前位为0,则需要继续考虑后面的低位上的数字是否也为0,若否,则需要将当前位上的数字改为1,并继续判断下一个高位上的数字是否为1,若是,则可以将其删除。如此循环进行,直到所有的值为k的元素均被删除为止。
下面是c/c++代码实现:
```c++
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int a[MAXN],vis[MAXN];
int main(){
int n,k,cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
vis[a[i]]++;
}
for(int i=n;i>=1;i--){
if(vis[a[i]]&&a[i]!=k){
int j=i;
while(j&&(a[j]==a[i])) j/=2;
if(!j) continue;
cnt++;
vis[a[i]]--;
vis[a[j]]++;
}
}
printf("%d\n",cnt);
return 0;
}
```
注:该代码为c++代码。
阅读全文