开局一行$srand$,得分全靠随机化。
发现两个并不显然的性质:
1.选中的人和怪物一定是按顺序的。第一个人打所有被选中怪物的第一只,第二个人打第二只,$etc$。
2.最优方案打的怪物一定是一段连续的区间。(因为过去再反方向回来到任务点一定不优)
所以直接枚举第一个打哪只怪即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar(); return x*f; } const int N=5005; int p[N],q[N],n,m,s,vis[N]; ll ans=1e15; int abss(int x) { return x>0?x:-x; } ll cost(int i,int j) { return 1LL*(1LL*abss(p[i]-q[j])+1LL*abss(s-q[j])); } int main() { n=read();m=read();s=read(); for(int i=1;i<=n;i++) p[i]=read(); for(int i=1;i<=m;i++) q[i]=read(); sort(p+1,p+n+1);sort(q+1,q+m+1); for(int i=1;i<=m;i++) { ll tmp=0; for(int j=1;j<=n;j++) tmp=max(tmp,cost(j,i+j-1)); ans=min(ans,tmp); } cout<<ans<<endl; return 0; }
原文:https://www.cnblogs.com/Rorschach-XR/p/11556216.html