亏 了 这 是 1700 分 的 贪 心 . . . . . . 完 全 是 模 拟 嘛 . . . . . . 亏了这是1700分的贪心......完全是模拟嘛...... 亏了这是1700分的贪心......完全是模拟嘛......
贪 心 思 路 还 是 很 显 然 的 , 维 护 一 个 当 前 要 放 的 板 子 数 贪心思路还是很显然的,维护一个当前要放的板子数 贪心思路还是很显然的,维护一个当前要放的板子数
每 次 选 取 能 到 的 最 远 地 方 放 板 子 , 如 果 选 那 个 地 方 导 致 板 子 放 不 下 每次选取能到的最远地方放板子,如果选那个地方导致板子放不下 每次选取能到的最远地方放板子,如果选那个地方导致板子放不下
那 就 选 一 个 尽 量 远 的 地 方 那就选一个尽量远的地方 那就选一个尽量远的地方
正 确 性 是 显 然 的 , 因 为 我 们 可 以 跳 [ 1 , d ] 间 任 意 数 目 步 子 正确性是显然的,因为我们可以跳[1,d]间任意数目步子 正确性是显然的,因为我们可以跳[1,d]间任意数目步子
#include <bits/stdc++.h>
using namespace std;
int n,m,d,sumn;
int a[1009],ans[1009];
void work(int l,int r,int num){
for(int i=l;i<=r;i++) ans[i]=num;
}
void over(){
cout<<"NO",exit(0);
}
int main()
{
cin>>n>>m>>d;
for(int i=1;i<=m;i++) cin>>a[i],sumn+=a[i];
int last=0;
for(int i=1;i<=m;i++)
{
int far=last+d;//最远可以放在这里
int ss=n-far+1;//还可以放这么多块板子
if(ss>=sumn) work(far,far+a[i]-1,i);
else
{
far=n-sumn+1;
if(far<=last) over();
work(far,far+a[i]-1,i);
}
last=far+a[i]-1;
sumn-=a[i];
}
if(n+1-last>d) over();
cout<<"YES"<<endl;
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
}