首页 > 其他分享 >uva 1474(dp)

uva 1474(dp)

时间:2023-06-28 23:01:39浏览次数:36  
标签:int 避难所 long 队伍 1474 path uva id dp


题意:有n个队伍修路,有m个避难所,编号从1开始,给出了每个队伍和避难所的位置,每个队伍和避难所之间的距离是|a[i] - b[j]|,如果为每一个队伍分配避难所,且每个避难所至少被分配一个队伍,问每个队伍和自己的避难所之间最短距离和是多少,给出每个队伍分配的避难所编号。
题解:dp的状态很好找,因为距离差要最短,所以先把位置都排序,f[i][j]表示前i个队伍前j个避难所分配后的最短距离和。
f[i][j] = min(f[i - 1][j - 1],f[i - 1][j]) + abs(a[i] - b[j])

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 4005;
const long long INF = 1e18;
struct Point {
    int v, id;
}p[N], s[N];
int n, m, path[N][N], res[N];
long long f[2][N];

bool cmp(Point a, Point b) {
    return a.v < b.v;
}

void print_path(int a, int b) {
    if (a == 0 || b == 0)
        return;
    res[p[a].id] = s[b].id;
    print_path(a - 1, b - path[a][b]);
}

int main() {
    while (scanf("%d", &n) == 1) {
        //input
        for (int i = 1; i <= n; i++) {
            scanf("%d", &p[i].v);
            p[i].id = i;
        }
        scanf("%d", &m);
        for (int i = 1; i <= m; i++) {
            scanf("%d", &s[i].v);
            s[i].id = i;
        }
        //solve
        sort(p + 1, p + n + 1, cmp);
        sort(s + 1, s + m + 1, cmp);
        //dp
        for (int i = 1; i <= m; i++)
            f[0][i] = INF;
        f[0][0] = 0;
        for (int i = 1; i <= n; i++) {
            int now = i & 1;
            for (int j = 0; j <= m; j++)
                f[now][j] = INF;
            for (int j = 1; j <= m && j <= i; j++) {
                long long temp = abs(p[i].v - s[j].v);
                if (f[now ^ 1][j - 1] <= f[now ^ 1][j]) {
                    f[now][j] = f[now ^ 1][j - 1] + temp;
                    path[i][j] = 1;
                }
                else {
                    f[now][j] = f[now ^ 1][j] + temp;
                    path[i][j] = 0;
                }
            }
        }
        printf("%lld\n", f[n & 1][m]);
        //print path
        print_path(n, m);
        for (int i = 1; i < n; i++)
            printf("%d ", res[i]);
        printf("%d\n", res[n]);
    }
    return 0;
}


标签:int,避难所,long,队伍,1474,path,uva,id,dp
From: https://blog.51cto.com/u_10729926/6577235

相关文章

  • uva 12470(矩阵快速幂)
    题意:公式f(n)=f(n-1)+f(n-2)+f(n-3),给出n,f(1)=0,f(2)=1,f(3)=2,要求得出f(n)。题解:普通的矩阵快速幂模板题。#include<stdio.h>#include<string.h>constintMOD=1000000009;structMat{longlongg[3][3];}ori,res;longlongn;Matmultiply(......
  • Linux 中的 dpkg 命令及示例
    Linux因其稳定性、安全性和灵活性而成为世界上使用最广泛的操作系统之一。Linux操作系统的关键组件之一是包管理系统。正在使用不同的包管理系统,但最流行的系统之一是dpkg系统。在本文中,我们将探讨Linux中的dpkg命令、它的作用以及如何有效地使用它。我还将提供一些示例来......
  • uva 465(高精度)
    题目:Writeaprogramthatreadsanexpressionconsistingoftwonon-negativeintegerandanoperator.Determineifeitherintegerortheresultoftheexpressionistoolargetoberepresentedasa``normal''signedinteger(typeintegerifyouar......
  • uva 123(排序、检索)
    题目:Searchingandsortingarepartofthetheoryandpracticeofcomputerscience.Forexample,binarysearchprovidesagoodexampleofaneasy-to-understandalgorithmwithsub-linearcomplexity.Quicksortisanefficient[averagecase]comparisonbased......
  • uva 10034(最小生成树)
    题目:InanepisodeoftheDickVanDykeshow,littleRichieconnectsthefrecklesonhisDad'sbacktoformapictureoftheLibertyBell.Alas,oneofthefrecklesturnsouttobeascar,sohisRipley'sengagementfallsthrough.ConsiderDick......
  • uva 10878(字符串)
    题目:"Machinestakemebysurprisewithgreatfrequency."AlanTuringYourbosshasjustunearthedarollofoldcomputertapes.Thetapeshaveholesinthemandmightcontainsomesortofusefulinformation.Itfallstoyoutofigureoutwhatisw......
  • uva 113(数学)
    题目:Currentworkincryptographyinvolves(amongotherthings)largeprimenumbersandcomputingpowersofnumbersmodulofunctionsoftheseprimes.Workinthisareahasresultedinthepracticaluseofresultsfromnumbertheoryandotherbranchesofmat......
  • 浅谈单调队列优化DP
    对于形如\[f_i=\max(f_{L≤j≤R}+w_i)\]的状态转移方程,也就是转移来自之前某个定长区间的最值,我们可以使用单调队列来维护区间最值,从而优化时间复杂度。烽火传递我们看到题目可以想到用\(f_i\)表示考虑到\(i\)这个烽火台,点第\(i\)个的合法方案中的最小代价那么可以想到......
  • docker报错:Error response from daemon: driver failed programming external connect
    重启docker-compose时,nginx服务报错。报错信息:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointlikeshop-nginx(f0a809481f5016e6f7ca6e1ed826b0676d5523b15f2954a2d22c03c12a89567d):Bindfor0.0.0.0:80failed:portisalr......
  • PACM Team (牛客多校) (DP 01背包, 维度较多)
    题目大意:给出n个物品,物品有4个空间值,然后有一个权值问在不超过最大的空间值时,最大的权值  思路:一开始想了很多其他思路没有想出来开始广搜算法,发现dp可以解决(注意看数据范围,是满足的)遇到奇怪的题,就试试dp,特别在数据范围很小的时候 ......