【poj3375】 Network Connection

http://poj.org/problem?id=3375 (题目链接)

题意

  有$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<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#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;
}
时间: 2024-10-20 21:59:48

【poj3375】 Network Connection的相关文章

【MongoDB】The connection between two tables

In mongoDB, there are two general way to connect with two tables. Manual Connection and use DBRef 1. Basically manual connection Firstly init the data which was saved in the different collections. The result: 2 usage of  DBRef grammar:  the example:

【转】[Network] 计算机网络基础知识总结

阅读目录 1. 网络层次划分 2. OSI七层网络模型 3. IP地址 4. 子网掩码及网络划分 5. ARP/RARP协议 6. 路由选择协议 7. TCP/IP协议 8. UDP协议 9. DNS协议 10. NAT协议 11. DHCP协议 12. HTTP协议 13. 一个举例 计算机网络学习的核心内容就是网络协议的学习.网络协议是为计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行.一

【BZOJ】【1834】【ZJOI2010】Network 网络扩容

网络流/费用流 这题……我一开始sb了. 第一问简单的最大流…… 第二问是要建费用流的图的……但是是在第一问的最大流跑完以后的残量网络上建,而不是重建…… 我们令残量网络上原有的弧的费用全部为0(因为如果还能走就不需要扩容),而新加的弧容量为INF,费用为给定的w[i]. 然后跑费用流就好了……这样建的话如果是不用扩容的边它就会自己走费用为0的弧. RE/TLE:费用流扩展时的队列/边集数组的大小 M 开小了,队列长度从N改成M,M大小从20000改成50000后AC 1 /**********

【POJ1144】Network(割点)(模板)

题意:给定一张无向图,求割点个数 思路:感谢CC大神http://ccenjoyyourlife.blog.163.com/的讲解 割点的定义就是某个联通块中删去此点连通性发生变化的的点 有两种割点:1.U为树根,子树个数>1 2.U非树根,有U的子节点V满足low[v]>=dfn[u]表示U的V子树必须通过U去到U的上面 更新时也有两种:dfn[u]<dfn[v]时u--->v 实边 反则u--->v 虚边 实边时low[u]=min(low[u],low[v]) 虚边lo

【BZOJ3732】 Network Kruskal+倍增lca

Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000). 现在有 K个询问 (1 < = K < = 15,000). 每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少? Input 第一行: N, M, K. 第2..M+1行: 三个正整数

【BZOJ1834】network 网络扩容(最大流,费用流)

题意:给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的最小扩容费用. 30%的数据中,N<=100 100%的数据中,N<=1000,M<=5000,K<=10 思路:RYZ作业 第一问最大流即可 第二问网上很多题解都是在第一问的残余网络上构图,但是根本不需要 考虑边(x,y,z,w) 有容量为z,费用为0的免费流量,有容量为INF,费用为w的扩容付费流

【BZOJ3732】Network,NOIP2013货车运输,ygylca

跟NOIP的题是一模一样的,我重写了一遍,这个代码更清晰一点. 思路见http://blog.csdn.net/vmurder/article/details/38734663 但我仍要再说一遍思路. 首先我们最小生成树建图,这个就不进行证明了,因为按照kruskal建图的话,每遍历过一条边,就相当于有一些询问间有了道路,而且一定是该边. 然后就是ygylca了.思想:把要处理的东西扔到该节点,按一定顺序在该节点处理,并且处理后扔到lca,然后因为到了lca处时有些需要顺序处理的信息已经处理完了

【POJ1236】Network of Schools 强联通分量缩点(本文kosaraju)

/*不要说这题多水之类的--我只是想记一下kosaraju这种屌炸天的dfs序延伸算法(说不定能加到我的ygylca里面)*/ 题意神马的都不说了,好吧,就是给你个图,n个点,然后n行每行都描述该点的出边,图建完了,然后缩点,然后问多少个点没有入度,再问需要加几条边可以让图变强联通图. 强联通图:图中任意两点之间都能互相到达(前提得是有向图你懂的,无向图就有点乱了,根本不要算法了,暴搜就好了) 强联通分量:同强联通图,不过是图中一部分. 缩点,把一个分量视为一个点,缩起来(一般不缩,都是记录每个

MongoDB【UVE】 - 连接Connection

简单的填写你所需要连接的MongoDB的库,即可. 这里为了方便,我们的名字也就是Server的 IP地址 simple Tips , 简单的记录.