简单贪心题.但是我才知道lower_bound找不到就算返回n...第一次学到= - =好累好困,还有一个挺难的dp要学
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+50; ll pos[N]; int main() { int T;scanf("%d",&T); while(T--) { ll n,m,p;scanf("%lld%lld%lld",&n,&m,&p); ll ans=1e18; for(int i=1;i<=n;i++) scanf("%lld",&pos[i]); int num=lower_bound(pos+1,pos+1+n,p)-pos-1; for(int i=1;i<=num&&i<n;i++) { ll dis=p-pos[i]; ll rem=num-i+1; if(rem>m) continue; rem=m-rem;ll dx=0; ans=min(ans,dis+(rem)*(pos[i+1]-pos[i])+dx); if(rem>0&&num+1<=n) { rem--,dx=2ll*(pos[num+1]-p); ans=min(ans,dis+(rem)*(pos[i+1]-pos[i])+dx); } } for(int i=num+1;i<n;i++) { ll dis=pos[i]-p; ll rem=i-num; if(rem>m) continue; rem=m-rem;ll dx=0; ans=min(ans,dis+(rem)*(pos[i+1]-pos[i])+dx); if(rem>0&&num>=1) { rem--,dx=2ll*(p-pos[num]); ans=min(ans,dis+(rem)*(pos[i+1]-pos[i])+dx); } }printf("%lld\n",ans); } return 0; } /* 1 3 10 2 1 10 14 */