直接上代码吧:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxx=1e6+5;
ll p[maxx];
int main(){
int i,m,ans;
ll n,k,maxn,empty;
cin>>n>>m>>k;
for(int i=0;i<m;i++)cin>>p[i];
ans=empty=i=0;
maxn=k;
while(i<m){
if(p[i]<=maxn){
while(p[i]<=maxn&&i<m){//其实这里的maxn相当于一个指针,标记着当前可以删除的最大位置
empty++;//empty代表这一位删去之后就空了,下一次的maxn相应的要增大一位
i++;//删去了一个数,那么下次就该删下一个了(废话)
}
ans++;//ans代表操作次数
maxn+=empty;
empty=0;
}
else {// 如果没有可以删除的数,那就翻页
ll temp=p[i]-maxn;//temp代表要达到可删除的位置,至少移动的空格
if(temp%k)maxn+=(temp/k+1)*k ;//temp/k代表翻几页,向上取整
else maxn+=temp;
}
//cout<<ans<<endl;
}
cout<<ans<<endl;
}