【dp】codeforces 830-A Office Keys

CN_swords發表於2017-07-27

Link:http://codeforces.com/problemset/problem/830/A

#include <bits/stdc++.h>
using namespace std;

/*
830-A Office Keys
題意:n個人,k把鑰匙,每個人需要找到一把鑰匙,同時行動到辦公室,
求所有人都到最少需要的時間。
題解:貪心想一下,如果最右邊的人取了最右邊的鑰匙,是否其他人取這個鑰匙更好。
我們知道其實最右邊的人取的鑰匙的位置,一定在他左邊的人取的鑰匙的位置的右邊。
那麼我們需要排序下,再動規下,dp[i][j]代表前i個取範圍1-j鑰匙的最少花費時間。
*/
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF=0x3f3f3f3f;
const int N=2010;
const int mod = 1e9+7;

int a[N],b[N];
int dp[N][N];
int main()
{
    int n,m,p;
    scanf("%d%d%d",&n,&m,&p);
    for(int i = 0; i < n; i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    for(int i = 0; i < m; i++)
        scanf("%d",&b[i]);
    sort(b,b+m);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            dp[i][j] = INF*2;
    for(int i = 0; i < n; i++)
    {
        for(int j = i; j < m; j++)
        {
            if(i == 0){
                dp[i][j] = abs(a[i]-b[j])+abs(b[j]-p);
                if(j != 0)
                    dp[i][j] = min(dp[i][j],dp[i][j-1]);
            }
            else{
                dp[i][j] = min(dp[i][j-1],max(dp[i-1][j-1],abs(a[i]-b[j])+abs(b[j]-p)));
            }
            //printf("%d %d: %d\n",i,j,dp[i][j]);
        }
    }
    printf("%d\n",dp[n-1][m-1]);
    return 0;
}



相關文章