解题:POI 2013 Taxis

时间:2023-03-09 15:44:22
解题:POI 2013 Taxis

题面

设当前位置为$pos$,那么可以发现在出租车总部左侧时,每辆车的贡献是$x[i]-(d-pos)$,而在右侧时只有$x[i]>=m-d$的车能够把人送到,那么首先我们要找出最小的满足$x[i]>=m-d$的车用来送人。接下来考虑在出租车总部左侧的策略,容易发现一定是先叫$x[i]$大的车,然后注意细节模拟一下就可以了。

细节1:可能我们在左侧坐了一次车直接就到了终点,注意判断

细节2:我们留那辆车是可以从左边出来接我们的=。=

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long m,d,n,np,las,ans,x[N];
int main ()
{
scanf("%lld%lld%lld",&m,&d,&n);
for(int i=;i<=n;i++)
scanf("%lld",&x[i]);
sort(x+,x++n);
for(int i=n;i;i--)
{
if(x[i]<=d-np) {las=i; break;}
np+=x[i]-(d-np),ans++;
if(np>=d) printf("%lld",ans+(np<m)),exit();
}
(m+d-*np<=x[las])?printf("%lld",ans+):printf("");
return ;
}