zoukankan      html  css  js  c++  java
  • CF Round #424 Div.2 D

    n个人拿K个钥匙中的n个然后到办公室(点p) 问最少需要的时间是多少

    先排序

    如果j<=i 则必须拿这个钥匙 

    dp[i][j]=max(dp[i-1][j-1],abs(p-b[j])+abs(a[i]-b[j]));

    反之 则可以选择拿或者不拿

    dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1],abs(p-b[j])+abs(a[i]-b[j])));
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<climits>
    using namespace std;
    int a[150000];
    int b[150000];
    int dp[1005][1005];
    int main()
    {
        int n,k,p;
        while(~scanf("%d%d%d",&n,&k,&p))
        {
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)scanf("%d",&a[i]);
            for(int i=1;i<=k;i++)scanf("%d",&b[i]);
            sort(a+1,a+1+n);
            sort(b+1,b+1+k);
            for(int i=1;i<=n;i++)
            {
                for(int j=i;j<=k;j++)
                {
                    if(i>=j)
                    {
                        dp[i][j]=max(dp[i-1][j-1],abs(p-b[j])+abs(a[i]-b[j]));
                        continue;
                    }
                    dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1],abs(p-b[j])+abs(a[i]-b[j])));
                }
            }
            int output=INT_MAX;
            for(int i=n;i<=k;i++)
            {
                output=min(output,dp[n][i]);
            }
            printf("%d
    ",output);
        }
    }
  • 相关阅读:
    初涉数组
    声明
    简述java程序中的main方法
    概述java语言
    1.3 linux基础(三)
    linux基础之-screen命令
    1.2 linux基础(二)
    1.1 Linux基础(一)
    实验7-1-13 装箱问题
    实验7-1-12 组个最小数
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7516073.html
Copyright © 2011-2022 走看看