博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【poj3375】 Network Connection
阅读量:4677 次
发布时间:2019-06-09

本文共 1267 字,大约阅读时间需要 4 分钟。

 (题目链接)

题意

  有$M$个网络接口和$N$台计算机,给出它们的坐标(在同一直线上),一个接口只能接一台计算机,费用为两坐标之差的绝对值,问最小费用为多少。

Solution

  $f[i][j]$表示前$i$台计算机连在前$j$个网络接口上的最小费用。转移:$$f[i][j]=min(f[i][j-1],f[i-1][j-1]+|X[i]-X[j]|)$$

  考虑$m$的范围很大,肯定有很多是无用的,我们找到距离$i$最近的接口$pos$,从$N-pos$ for到$N+pos$即可。

细节

  LL

代码

// poj3375#include
#include
#include
#include
#include
#include
#define LL long long#define inf (1ll<<60)#define Pi acos(-1.0)#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);using namespace std;const int maxn=200010;int t1[maxn],t2[maxn],pos[maxn],n,m;LL f[2][maxn];int main() { scanf("%d%d",&m,&n); for (int i=1;i<=m;i++) scanf("%d",&t2[i]); for (int i=1;i<=n;i++) scanf("%d",&t1[i]); sort(t1+1,t1+n+1); sort(t2+1,t2+m+1); for (int i=1;i<=n;i++) pos[i]=lower_bound(t2+1,t2+1+m,t1[i])-t2; memset(f,0x7f,sizeof(f)); for (int i=0;i<=m;i++) f[0][i]=0; int p=0,q=1,l,r,u=0,v=m; for (int i=1;i<=n;i++) { l=max(1,pos[i]-n),r=min(m,pos[i]+n); p^=1,q^=1; for (int j=l;j<=r;j++) f[p][j]=min(f[p][j-1],f[q][min(j-1,v)]+abs(t1[i]-t2[j])); for (int j=u;j<=v;j++) f[q][j]=inf; u=l,v=r; } printf("%lld",f[p][r]); return 0;}

 

转载于:https://www.cnblogs.com/MashiroSky/p/6420993.html

你可能感兴趣的文章
国内5家云服务厂商 HTTPS 安全性测试横向对比
查看>>
how to control project
查看>>
转 python新手容易犯的6个错误
查看>>
第四节 -- 列表
查看>>
决策树
查看>>
团队作业
查看>>
如何避免在简单业务逻辑上面的细节上面出错
查看>>
大型网站高并发的架构演变图-摘自网络
查看>>
8丶运行及总结
查看>>
redis安装配置
查看>>
结对项目博客
查看>>
讨论记录:求大于一个时间段的最大平均积分,O(n)时间实现
查看>>
error) DENIED Redis is running in protected mode because protected mode is enabled报错
查看>>
CSS-16-margin值重叠问题
查看>>
selenium常用方法
查看>>
第二次作业
查看>>
ios 面试题
查看>>
MySQL教程(二)—— 关于在ACCESS中使用SQL语句
查看>>
实验4.1
查看>>
接口Interface
查看>>