题意:给定一个长度为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; }