设当前位置为$pos$,那么可以发现在出租车总部左侧时,每辆车的贡献是$x[i]-(d-pos)$,而在右侧时只有$x[i]>=m-d$的车能够把人送到,那么首先我们要找出最小的满足$x[i]>=m-d$的车用来送人。接下来考虑在出租车总部左侧的策略,容易发现一定是先叫$x[i]$大的车,然后注意细节模拟一下就可以了。
细节1:可能我们在左侧坐了一次车直接就到了终点,注意判断
细节2:我们留那辆车是可以从左边出来接我们的=。=
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=500050; 6 long long m,d,n,np,las,ans,x[N]; 7 int main () 8 { 9 scanf("%lld%lld%lld",&m,&d,&n); 10 for(int i=1;i<=n;i++) 11 scanf("%lld",&x[i]); 12 sort(x+1,x+1+n); 13 for(int i=n;i;i--) 14 { 15 if(x[i]<=d-np) {las=i; break;} 16 np+=x[i]-(d-np),ans++; 17 if(np>=d) printf("%lld",ans+(np<m)),exit(0); 18 } 19 (m+d-2*np<=x[las])?printf("%lld",ans+1):printf("0"); 20 return 0; 21 }