zoukankan      html  css  js  c++  java
  • LA 4987 背包

    题意:

    有n个施工队,给定他们的位置,有m个防空洞,给定位置,求将施工队放到m个防空洞里面,最少的总距离?

    n<=4000

    分析:

    dp[i][j] 前 i 个施工队,放到前 j 个防空洞里面的最少距离;

    dp(i+1,j) = min(dp(i,j),dp(i,j-1)) + dist(a[i] - b[j]);

    DP采用滚动数组;

    那么,第二维的防空洞该怎么循环呢?

    因为,每个防空洞都要有,那么这类似于背包中的容量,刷表的方式;

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 4000+5;
    const int inf = 0x3f3f3f3f;
    
    struct node {
        int d;
        int id;
        int ans;
    }A[maxn],B[maxn];
    
    long long dp[maxn];
    int path[maxn][maxn];
    int n,m;
    
    bool cmp(node a,node b) {
        if(a.d==b.d)
            return a.id < b.id;
        return a.d < b.d;
    }
    
    void find_path(int i,int j) {
        if(i)
            find_path(i-1,path[i][j]);
        A[i].ans = B[j].id;
    }
    
    int cmp1(node a,node b) {
        return a.id < b.id;
    }
    
    int main()
    {
        while(~scanf("%d",&n)) {
            for(int i=0;i<n;i++)
            {
                scanf("%d",&A[i].d);
                A[i].id = i;
            }
    
            scanf("%d",&m);
            for(int i=0;i<m;i++) {
                scanf("%d",&B[i].d);
                B[i].id = i;
            }
    
            sort(A,A+n,cmp);
            sort(B,B+m,cmp);
    
            memset(dp,inf,sizeof(dp));
            dp[0] = abs(A[0].d-B[0].d);
    
            for(int i=1;i<n;i++) {
                for(int j=min(m-1,i);j>=0;j--) {
                    if(!j||dp[j]<dp[j-1]) {
                        path[i][j] = j;
                        dp[j] = dp[j] + abs(A[i].d-B[j].d);
                    }
                    else {
                        path[i][j] = j-1;
                        dp[j] = dp[j-1] + abs(A[i].d - B[j].d);
                    }
                }
            }
    
            printf("%lld
    ",dp[m-1]);
            find_path(n-1,m-1);
            sort(A,A+n,cmp1);
    
            for(int i=0;i<n;i++)
                printf("%d ",A[i].ans+1);
            puts("");
    
    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    VSPD虚拟串口工具
    Go 普通指针类型、unsafe.Pointer、uintptr之间的关系
    Go内存对齐
    自定义URL Protocol 协议
    C# 百钱买百鸡
    C++输出九九乘法表
    C#嵌入子窗体,判断子窗体是否打开了
    K3 WISE 开发插件《K3 WISE常用数据表整理》
    提取Jar2Exe源代码,JavaAgent监控法
    Linux密码重置
  • 原文地址:https://www.cnblogs.com/TreeDream/p/7076961.html
Copyright © 2011-2022 走看看