C - Platforms Jumping

题意很简单,有个长为n的河,有m块长为ci的木板,一次最多跳跃d格,问能否从0跳到n+1

首先判断不能通过的情况,然后for循环把一个个木板安排下去即可,注意不要RE。详细看注释

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<string>
 7 #include<stack>
 8 #include<queue>
 9 #include<vector>
10 #include<cstdlib>
11 //#include<windows.h>
12 #define first fi
13 #define second se
14 using namespace std;
15 typedef long long ll;
16 const int N = 1e4+10;
17 const int INF = 0x3f3f3f3f;
18 const int inf = - INF;
19 const int mod = 1e9+7;
20 const double pi = acos(-1.0);
21 
22 int c[N];
23 int p[N];
24 int main()
25 {   
26     memset(p,0,sizeof(p));
27     int n,m,d;
28     scanf("%d%d%d",&n,&m,&d);
29     int sum=0,now=0;
30     for(int i=1;i<=m;i++){
31         scanf("%d",&c[i]);
32         sum+=c[i];
33         now+=d+c[i]-1;//木板输入的过程模拟移动,所以now是等于原来的位置加上跳跃的最大长度再加上木板的长度
34     }   
35     if(now+d<n+1)//最后还能再跳一次,now属于最大移动距离,小于n+1的话则无法完成。
36         printf("NO\n");
37     else{
38         now=0;
39         for(int i=1;i<=m;i++){
40             if(now+d+sum-1<=n) now+=d;//如果比n大那木板必定有重合
41             else now=n-sum+1;
42             for(int j=now;j<=now+c[i]-1;j++)
43                 p[j]=i;
44             now+=c[i]-1;
45             sum-=c[i];
46         }
47         printf("YES\n");
48         for(int i=1;i<=n;i++){
49             if(i==1) printf("%d",p[i]);
50             else printf(" %d",p[i]);
51         }
52         printf("\n");
53     }
54     //system("pause");
55     return 0;
56 }
posted @ 2019-12-07 21:36  Obake  阅读(83)  评论(0)    收藏  举报