题意:
给你n个人和k把钥匙分别在某个位置,然后每个钥匙只能被一个人拥有,且都额能打开最后的门,
问你所有人都到达终点所用的最短时间。
题解:
这题只能贪心了,,,
把所有人的位置以及钥匙的位置全部sort一遍,
sort后,前一个人去的钥匙位置一定在后一个人取得钥匙前面,否则产生交叉肯定多浪费时间。
二分最长时间,从左向右验证 182ms。
or然后依次从一边向另一边dp,do[i][j]表示 前j个人用前i把钥匙到达终点的最长时间。
so i==j 时, 该把钥匙一定要拿上。 dp[i][j]=max(dp[i-1][j-1],abs(a[j]-key[i])+abs(p-key[i]));
else 求最小值。 dp[i][j]=min(dp[i-1][j],max(dp[i-1][j-1],abs(a[j]-key[i])+abs(p-key[i])));
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2020;
int n,k,p;
int dp[maxn][maxn];
int a[maxn],key[maxn];
int main(){
scanf("%d %d %d",&n,&k,&p);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=k;++i)
scanf("%d",&key[i]);
sort(a+1,a+1+n);
sort(key+1,key+1+k);
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;++i){
for(int j=1;j<=n;++j){
if(i==j)
dp[i][j]=max(dp[i-1][j-1],abs(a[j]-key[i])+abs(p-key[i]));
else
dp[i][j]=min(dp[i-1][j],max(dp[i-1][j-1],abs(a[j]-key[i])+abs(p-key[i])));
}
}
printf("%d",dp[k][n]);
return 0;
}