题目来源:https://biancheng.love/contest-ng/index.html#/41/problems
E
网络传输
题目描述
网络上的数据传输是共用数据线的,当一台主机发送传输请求时网络上有其他主机在发送数据,就不能成功发送只能等待。如果网络经常处于占用情况,平均等待时间过长,可能说明网络负载过重、拓扑结构不好或延时算法有问题。为了检测是否有这些问题,可以在服务器之间发送一些数据查看响应时间。
不过现在,我们姑且简化问题,将网络看做是一维的线段,各个主机看做线段上的点。当主机i向主机j发送数据时,i->j窗口所有的主机此时都不能发送数据。每次数据传输为1单位时间(由于网线上数据传输速度很快,不计距离影响)。
下面给出一组测试,求完成所有传输请求需要使用的最少的时间。
输入
多组测试数据,每组N+1行。
每组第一行数为题目描述中一组测试的请求数n
接下来n行,每行2个整数i,j,表示一次数据传输i->j。
1<=i,j<=N<=10000
输出
对于每组数据,输出一行,为最小用时。
输入样例
3
1 3
3 4
5 1
输出样例
3
解题思路:找到网络传输中最拥堵的地方,由于是单位时间的传输,因此拥堵的程度也就是最短的传输时间。
网络拓扑、AOV网络、AOE网络.
AOV网络:通常把计划、施工过程、生产流程和程序流程等都当作成一个工程。除了很小的工程外,一般都把工程划分为若干个成为“活动”的子工程。完成了这些活动,这个工程也就完成了。简称为AOV网络(Activity On Vertices)
AOE网络:如果在无有向环的有向带权图中用有向边表示一个工程中的各项活动,用有向边上的权重表示活动的持续时间,用顶点表示事件,则这样的有向图叫做用边表示活动的网络,简称为AOE网络(Activity On Edges)
在本题中,需要求出最少时间.本网络一共包括了n个操作,我们为了求出最短时间只需要确定操作的顺序.但是如果暴力的话,一共有n!种操作顺序,因此这种思路不可以。
分析:
1.数轴上一共有n条线段,需要找到相交处最多的地方。
2.由于网络传输数据本一定是按照从小到大的顺序,可以在每次输入数据之后进行判断i,j的大小,然后将i->j上的每个点(整数点)拥堵频率都递加1.
3.找到最拥堵的地方,采用sort时间复杂度为O(nlgn),但是由于只需要找到最大的拥堵,也就是顺序统计量的查找.最大值查找的时间复杂度为线性时间.
给出代码:
1 #include <bits/stdc++.h> 2 #define MAX 10010 3 4 using namespace std; 5 int a[MAX]; 6 int n,t,i,j,f,l,r,num;//l,r减小循环区间长度 7 8 int main() 9 { 10 while(~scanf("%d",&n)) 11 { 12 num=0; 13 l=10010;//左值 14 r=-1;//右值 15 memset(a,0,sizeof(a)); 16 for(t=1; t<=n; t++) 17 { 18 scanf("%d %d",&i,&j); 19 if(i>j)//完成交换 20 { 21 i^=j; 22 j^=i; 23 i^=j; 24 } 25 if(l>i) 26 l=i; 27 if(r<j) 28 r=j; 29 for(f=i; f<=j; f++) 30 { 31 a[f]++; 32 } 33 } 34 for(f=l; f<=r; f++)//找到最大值 35 { 36 if(num<a[f]) 37 num=a[f]; 38 } 39 printf("%d ",num); 40 } 41 }