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

 

题意:给定一个长度为n的池塘,m块木板以及他们各自的长度,每次你能从i跳到[i+1,i+d],木板之间的相对位置不能移动,可以相邻不能相交,求怎么放置木板能使得从0跳到n+1。

打比赛的时候手有点生,脑子也有点不清楚,但还有思路,边写边改,写到后面不知道自己写了什么…挺无语的,也挺难受的,比赛前两分钟就走了去学校操场吹了吹风。。

题解:我觉得这道题最难考虑的就是贪心贪过头了,木板没地方放了的情况,所以我就先把空地(0)的距离求出来,然后m次循环比较跳的最远距离和剩余空地的大小,取小的先铺0,然后再铺木板,直到没有空地了剩余的就全是木板。

#include<bits/stdc++.h>
#include<vector>
#include<map>
#include<queue>
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
int a[1005], ans[1005];
int main()
{
    int n, m, d;
    scanf("%d%d%d", &n, &m, &d);
    int sum = 0;
    for(int i = 1;i <= m;i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }
    if((m+1)*d+(sum-m) < n+1)         //左边是能跳的最远距离,n+1是实际需要跳跃的距离
    {
        printf("NO\n");
        return 0;
    }
    printf("YES\n");
    int temp = n - sum;               //temp为不放木板的总距离
    for(int i = 1;i <= m;i++)
    {
        int x = min(d-1 , temp);      //大部分时候都是d-1更小,为了后面更有余力,所以前面尽可能跳远一点
        temp -= x;                    //当temp更小时只需要把剩下的0放置完了后面全部铺木板就行了
        while(x--)                    //sum = n的情况temp为0,那么就会全部铺地板了
            printf("0 ");
        while(a[i]--)
            printf("%d ", i);
    }
    while(temp--)                     //把最后的0都输出
        printf("0 ");
    return 0;
}

 

 

posted @ 2019-11-05 19:19  Mamba0Z  阅读(230)  评论(0编辑  收藏  举报