思路全在注释里了:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=5e5+5;
int n,l,r,a[N];
bool Solve()
{
//打工次数:一个人能将其他人运过去的次数=一个人能过去以后能往返的次数
scanf("%d%d%d",&n,&l,&r);
int min_go=ceil(1.0*(n-r)/(r-l)); //最小来回总次数
//每一趟最多运(r-l)个人;最后一趟只用过去r个人,不用回来
int go_work=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
go_work+=min(a[i]-1>>1,min_go); //一个人能打工的最大次数(-1是因为自己坐船过去需要1的体力)
//每个人每趟只能打工一次,一共最多也只能打工最小来回总次数次,多了的没用
}
return go_work>=min_go*l;
//所有人能打工的总次数>=最小来回总次数×每次需要打工的人的数量(=一共需要打工的次数)
}
int main()
{
printf("%s\n",Solve()?"Yes":"No");
return 0;
}
标签:Bridging,min,int,多校,次数,打工,go,include,第三场
From: https://www.cnblogs.com/jerrycyx/p/18457009