2024牛客暑期多校训练营3 - A(Bridging the Gap 2)

题目链接:2024牛客暑期多校训练营3--A

题目大意:

n 个人 每个人的耐力值为a[i], 一条船至少有L个人至多有R个人,每次去河对岸要花费船上每个的的1点耐力值,问n个人能否去河对岸?

输入范围:
输入的第一行包含三个整数n,L,R (1<L<R<n<5×10^5),分别表示一次使用船的行走人数,最小和最大行走人数。
第二行输入包含n个整数h1,h2,hn(1≤hi<5× 10^5),其中hi (1<i<n)为第i位步行者的耐力值。

思路点播:

算出每辆船的最大来回次数,由每个人的耐力值计算出 此人来回次数,最后看n个人一共来回所需的次数是否符合。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl '\n'
const int N = 1e3 + 10, MAX = 1e18, MIN = -1e18;
int n, m, k, v[N];

signed main(){
	IOS
	int l, r;
	cin >> n >> l >> r; 
	int k = ceil((n - r) * 1.0 / (r - l)), ans = 0;  //(r - l)每次带过去的人数,(n - r) 最后r个人不用回 ---> k 来和回的次数
	for(int i = 1; i <= n; i ++){
		int a;
		cin >> a;
		ans += min((a - 1) / 2, k);   
		/*
		a作为每一个人的耐力值, 耐力值为奇数实际算来回次数是上一个偶数除2; 
		所以(a - 1) / 2是每个人来回的次数。 
		k最为每辆船的最多来回数,所以每次来回要和k取个min。
		tip:如果没取min---> 5 2 3     10 1 1 1 1  这个样例会出YES,导致答案错误。 
		*/
	}
	if(ans >= l * k) cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值