这题就属于随便做的题目了吧。。。
直接考虑贪心
在当前的点是要删除的数(=x)的时候,考虑它离最近的点需要多少步,离最近可以删的点为2k且这个点为离它前面最近的点,而它前面删掉的点有cur个,所以每个数需要(当前位置减2k-cur)次才能到达,所以得出程序:
#include<bits/stdc++.h> using namespace std; inline int read() { int x(0),neg(1);char ch(getchar()); while(!isdigit(ch)) { if (ch=='-') neg=-1; ch=getchar(); } while(isdigit(ch)) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*neg; } int n,k,x,cnt,cur; int main() { int ans=0; n=read(),k=read(); for (int i=1;i<=n;++i) { x=read(); if (x==k) { int t=i-(1<<((int)log2(i))); if (t>cur) { ans+=t-cur; cur=t; } cnt++; cur++; } } printf("%d\n",ans+cnt); return 0; }