T3 syx与他的邪恶序列 (easy version)

这题就属于随便做的题目了吧。。。

直接考虑贪心

在当前的点是要删除的数(=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;
}

猜你喜欢

转载自www.cnblogs.com/sunyx20060115/p/11595103.html