题目大意:
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;
}