您的位置:首页 > 其它

cf 830A Office Keys 【二分+贪心】

2017-07-15 09:24 267 查看
点击打开链接

题意:

       给你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]
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: