Codeforces Round #598 (Div. 3) C. Platforms Jumping

C. Platforms Jumping

题解:先根据木板总长s,(m+1)*(d-1)+ s > = n 可以通过否则不可以,然后根据剩余路程x(有水的)与d-1的大小判断,选择每次蹦的路程大小,详情看代码。

#include <bits/stdc++.h>
using namespace std;
int a[1003];

int main() {
	int n,m,d,s=0;
	cin>>n>>m>>d;
	for(int i=0;i<m;++i){
		cin>>a[i];
		s+=a[i];
	}
	if(s+(m+1)*(d-1)<n){
		cout<<"NO"<<endl;
		return 0;
	}
	cout<<"YES"<<endl;
	int now=0,t=0,x=n-s,pos=0;	//x需要跳过的水面路程 
	while(now<n){
		int jump=min(x,d-1);	
		now+=jump,x-=jump;
		for(int i=t;i<now;i++) cout<<0<<' ';
		if(pos<m){
			while(a[pos]--) {
				cout<<pos+1<<' ';
				now++;
			}
		}
		t=now;
		pos++;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值