题目链接
思路:先把所有的木板全都依次靠在右边,当跳d距离没有木板是再把木板移到这个距离,当没有木板可以移动的时候肯定是NO。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
int c[maxn],ans[maxn],n,m,d,flag=0;
int main()
{
scanf("%d%d%d",&n,&m,&d);
for(int i=1;i<=m;++i) scanf("%d",&c[i]);
c[m+1]=-1;
int k=m,t,cnt=n,last;
while(k>0)
{
t=c[k];
while(t>0) ans[cnt]=k,cnt--,t--;
last=cnt;
k--;
}
last++;
int now=0,size=1;
while(now+d<last)
{
if(c[size]==-1) {
flag=1;break;
}
int i=now+d,t=0;
for(int j=last;j<=last+c[size]-1;++j) ans[j]=0;
while(t<c[size]) ans[i]=size,i++,t++;
last+=c[size];
now=now+d+c[size]-1;
size++;
}
if(flag) {
puts("NO");return 0;}
puts("YES");
for(int i=1;i<=n;++i) printf("%d ",ans[i]);
}