解题:POI 2013 Taxis

题面

设当前位置为$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 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/9925924.html