题解:先根据木板总长s,(m+1)*(d-1)+ s > = n 可以通过否则不可以,然后根据剩余路程x(有水的)与d-1的大小判断,选择每次蹦的路程大小,详情看代码。
#include <bits/stdc++.h>
using namespace std;
int a[1003];
int main() {
int n,m,d,s=0;
cin>>n>>m>>d;
for(int i=0;i<m;++i){
cin>>a[i];
s+=a[i];
}
if(s+(m+1)*(d-1)<n){
cout<<"NO"<<endl;
return 0;
}
cout<<"YES"<<endl;
int now=0,t=0,x=n-s,pos=0; //x需要跳过的水面路程
while(now<n){
int jump=min(x,d-1);
now+=jump,x-=jump;
for(int i=t;i<now;i++) cout<<0<<' ';
if(pos<m){
while(a[pos]--) {
cout<<pos+1<<' ';
now++;
}
}
t=now;
pos++;
}
return 0;
}