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 }

浙公网安备 33010602011771号