题目传送门
思路:
首先我们可以打一个的暴力代码
获得分的好成绩
实现非常简单
回归正题
考虑分块
设表示当前的阅读量
可以先设表示第
个块的
值
于是我们可以先扫块
如果 就扫一遍这一个块
否则就跳过
每次最多扫个块 就是
个数
就可以扫出个数
最多扫次
时间复杂度
但是会出现这种情况
我们把块长改成
就AC了
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[510000],sum,ans,operiterer,d[2100];
bool vis[510000];
int main()
{
scanf("%d%d",&operiterer,&n);
int k=sqrt(n)/2;
int kuai=(n+k-1)/k;
for(int i=1;i<=kuai;i++)
{
d[i]=1e9;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
int u=(i+k-1)/k;
d[u]=min(d[u],a[i]);
}
bool flag=1;
while(sum<n&&flag)
{
flag=0;
ans++;
for(int i=1;i<=kuai;i++)
{
if(d[i]<=sum)
{
flag=1;
d[i]=1e9;
for(int j=k*(i-1)+1;j<=n&&j<=k*i;j++)
{
if(vis[j])
{
continue;
}
if(a[j]<=sum)
{
sum++;
vis[j]=1;
}
else
{
d[i]=min(d[i],a[j]);
}
}
}
}
}
if(sum<n)
{
ans=-1;
}
printf("%d",ans);
return 0;
}