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; }