Codeforces Round #598 (Div. 3)(C. Platforms Jumping)

[题目](https://codeforces.ml/problemset/problem/1256/C)

题意:有一条宽为n个河流,小丁在0号位置,要前往n+1位置,有m个木板在河流上方,给出长度ai,木板可以任意摆放但木板间的相对位置不能改变。

小丁每次可以跳跃的范围为0-d,问能否在不落水的情况下,到达n+1位置。

解法:贪心。最大值判断是否可达:小丁每次跳跃d,则可达最远处为所有木板长度加上(m+1)*(d-1)

如果可到达,则模拟贪心每次能消耗的最大空隙。

const int maxn = 1e3+9;
int a[maxn] , vis[maxn];
void solve(){
    int n , m , d ;
    cin >> n >> m >> d ;
    int sum = 0 ;
    rep(i , 1 , m){
        cin >> a[i];
        sum += a[i];
    }
    if(sum + (d-1)*(m+1) < n){//贪心所能达到的最远地方
        cout << "NO" << endl;
        return ;
    }
    int k = n - sum ;//剩余空隙数
    int index = 0 ;//木板下标
    int l = 0;//当前所在位置
    while(l < n){
        int ti = min(k , d-1);//尽可能的消耗的空隙
        l += ti ;
        int len = a[++index];//木板长度
        while(len--){
            vis[++l] = index ;
        }
        k -= ti ;//剩余空隙数
    }
    cout << "YES" << endl;
    rep(i , 1,  n){
        cout << vis[i] << " " ;
    }
    cout << endl;
}
原文地址:https://www.cnblogs.com/nonames/p/11823472.html