• 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;
    }
  • 相关阅读:
    011-通过网络协议解析网络请求-DNS-ARP-TCPIP
    010-HTTP协议
    009-DNS域名解析系统
    008-ICMP协议(网络控制文协议)
    007-IP报文协议
    007-排序算法-堆排序
    006-排序算法-希尔排序
    007-Linux 查看端口
    005-排序算法-归并排序
    004-排序算法-选择排序
  • 原文地址:https://www.cnblogs.com/Mamba0Z/p/11800905.html
Copyright © 2020-2023  润新知