zoukankan      html  css  js  c++  java
  • Codeforces Round #424 (Div. 2) D. Office Keys(dp)

    题目链接:Codeforces Round #424 (Div. 2) D. Office Keys

    题意:

    在一条轴上有n个人,和m个钥匙,门在s位置。

    现在每个人走单位距离需要单位时间。

    每个钥匙只能被一个人拿。

    求全部的人拿到钥匙并且走到门的最短时间。

    题解:

    显然没有交叉的情况,因为如果交叉的话可能不是最优解。

    然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿第j把钥匙再到门的时间。

    然后 后面那个min可以在for的时候保存下来,然后复杂度就O(n*m)了。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 using namespace std;
     4 
     5 const int N=2007;
     6 int dp[N/2][N],mi,n,m,s,a[N],b[N];
     7 
     8 int val(int i,int j){return abs(a[i]-b[j])+abs(b[j]-s);}
     9 
    10 int main(){
    11     scanf("%d%d%d",&n,&m,&s);
    12     F(i,1,n)scanf("%d",a+i);
    13     F(i,1,m)scanf("%d",b+i);
    14     sort(a+1,a+1+n),sort(b+1,b+1+m);
    15     F(i,1,n)
    16     {
    17         mi=dp[i-1][i-1];
    18         F(j,i,m)
    19         {
    20             dp[i][j]=max(val(i,j),mi);
    21             mi=min(mi,dp[i-1][j]);
    22         }
    23     }
    24     int ans=INT_MAX;
    25     F(i,n,m)ans=min(ans,dp[n][i]);
    26     printf("%d
    ",ans);
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    vue--常用指令
    vue--npm的使用
    DRF--认证和权限
    DRF--路由组件和版本控制
    nginx--代理和负载均衡
    DRF--重写views
    DRF--ModelSerializer和时间格式化
    DRF--验证器
    DRF--序列化
    DRF--介绍和安装
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7173047.html
Copyright © 2011-2022 走看看