开局一行$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