zoukankan      html  css  js  c++  java
  • Codeforces Round #598 (Div. 3) C

    题意:给定一个长度为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
    ");
            return 0;
        }
        printf("YES
    ");
        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;
    }
  • 相关阅读:
    ansible 2.2的源码编译安装
    存储过程-快速上手
    从库重启后报1062错误
    删除一张600万记录表的一个索引需要多长时间?
    mysql主从复制Error1205
    浅谈管理(三)如何管理资料库
    kettle之时间字段默认值为空或’0000-00-00’问题
    浅谈管理(二)项目管理
    乌龙之Ignoring query to other database问题
    一、安装
  • 原文地址:https://www.cnblogs.com/Mamba0Z/p/11800905.html
Copyright © 2011-2022 走看看