Disk Schedule

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1463    Accepted Submission(s): 189

Problem Description

有非常多从磁盘读取数据的需求,包含顺序读取、随机读取。为了提高效率,须要人为安排磁盘读取。然而。在现实中,这样的做法非常复杂。

我们考虑一个相对简单的场景。磁盘有很多轨道,每一个轨道有很多扇区,用于存储数据。当我们想在特定扇区来读取数据时,磁头须要跳转到特定的轨道、详细扇区进行读取操作。为了简单。我们如果磁头能够在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间。磁头也能够任意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳转前后磁头所在扇区位置不变。一次读取数据的时间为10个单位时间,读取前后磁头所在的扇区位置不变。磁头同一时候仅仅能做一件事:跳转轨道。旋转或读取。如今,须要在磁盘读取一组数据,如果每一个轨道至多有一个读取请求。这个读取的扇区是轨道上分布在
0到359内的一个整数点扇区,即轨道的某个360等分点。磁头的起始点在0轨道0扇区。此时没有数据读取。

在完毕全部读取后。磁头须要回到0轨道0扇区的始点位置。请问完毕给定的读取所需的最小时间。

Input

输入的第一行包括一个整数M(0<M<=100),表示測试数据的组数。对于每组測试数据,第一行包括一个整数N(0<N<=1000)。表示要读取的数据的数量。之后每行包括两个整数T和S(0<T<=1000,0<= S<360),表示每一个数据的磁道和扇区。磁道是按升序排列,而且没有反复。

 

Output

对于每组測试数据,输出一个整数。表示完毕所有读取所需的时间。

Sample Input

3

1

1 10

3

1 20

3 30

5 10

2

1 10

2 11

 

Sample Output

830

4090

1642

题解:

本题背景能够转化为旅行商问题,刚接触算法就知道旅行商问题是NP问题。

所以一直想有没有贪心思想能够找到某个贪心策略,简化问题。尝试写了一些对照公式。终于还是错了。就在网上搜了搜旅行商问题,结果看到双调欧几里得旅行商问题。这里双调是指二维坐标的当中一维是单调的。于是问题简化了非常多,能够尝试动态规划。题目旋转一周的时间是360个单位时间,跳转到一个相邻轨道的时间为400个单位时间,暗示换轨道比旋转一周更花时间。所以得知最好顺着归到依次读取。类比二维坐标系:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2ZlbmdjYW55dWV4ag==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

上图 中a是最短旅行商路线,但不是双调的;b是最短双调旅行商路线。

求解过程:

(1)首先将各点依照x坐标从小到大排列。时间复杂度为O(nlgn)。

(2)寻找子结构:定义从Pi到Pj的路径为:从Pi開始,从右到左一直到P1,然后从左到右一直到Pj。在这个路径上,会经过P1到Pmax(i,j)之间的全部点且仅仅经过一次。在定义dp(i,j)为满足这一条件的最短路径。

我们仅仅考虑i>=j的情况。同一时候。定义dist(i,j)为点Pi到Pj之间的直线距离。

(3)最优解:我们须要求的是dp(n,n)。关于子问题dp(i,j)的求解,分三种情况:

     A、当j < i - 1时,dp(i,j) = dp(i-1,j) + dist(i - 1,i)。由定义可知,点Pi-1一定在路径Pi-Pj上,并且又因为j<i-1,因此Pi的左边的相邻点一定是Pi-1.因此能够得出上述等式。

     B、当j = i - 1时,与Pi左相邻的那个点可能是P1到Pi-1总的不论什么一个。因此须要递归求出最小的那个路径:dp(i,j) = dp(i,i-1) = min{dp(k,j) + dist(i,k)},当中1 <= k <= j。

C、当j=i时,路径上最后相连的两个点可能是P1-Pi、P2-Pi...Pi-1-Pi。

因此有:dp(i,i) = min{dp(i,1)+dist(1,i),...,dp(i,i-1)+dist(i-1,i)}。

在此声明。上述算法思想转自这篇博客点击,在此表示感谢!

可能比較难理解,以下谈谈我的理解。

dp(i,j)表示从i到1再从1出发到j且经过当中的全部点,如果i>j。能够理解为2个人。一个跑得快用i表示,还有一个跑得慢用j表示。达到i可能是跑得快的,如图a。也可能是跑得慢的。如图b .

对于a,有dp(i,j)=dp(i-1,j)+dist(i-1,i);

对于b,求dp(i,i-1)。即从j直接跳到i。此时慢的、快的互换角色。即i,j互换,枚举j的位置。即dp(i,j)=dp(i,i-1)=min(dp(i,i-1),dp(i-1,k)+dist(k,i));

贴段代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6.  
  7. const int INF=100*1000*800;
  8. const int MAXN=1000+10;
  9. struct point
  10. {
  11. int x,y;
  12. };
  13. point vert[MAXN];
  14. int res[MAXN][MAXN];
  15.  
  16. int dis(int i,int j)
  17. {
  18. int t=abs(vert[i].x-vert[j].x)*400;
  19. int x1,x2;
  20. if(vert[i].y<vert[j].y)
  21. {
  22. x1=vert[i].y;
  23. x2=vert[j].y;
  24. }
  25. else
  26. {
  27. x1=vert[j].y;
  28. x2=vert[i].y;
  29. }
  30. int l=x2-x1;
  31. int r=360-x2+x1;
  32. return (l<r?
  33.  
  34. l:r)+t;
  35. }
  36.  
  37. int min(int a,int b)
  38. {
  39. return a < b ? a : b;
  40. }
  41.  
  42. int work(int n)
  43. {
  44. int i,j;
  45. int s,Min=INF;
  46. res[2][1]=dis(2,1);
  47. for(i=2;i<=n;i++)
  48. {
  49. for(j=1;j<i;j++)
  50. {
  51. res[i][j]=min(res[i][j],res[i-1][j]+dis(i-1,i));
  52. res[i][i-1]=min(res[i][i-1],res[i-1][j]+dis(j,i));
  53. }
  54. }
  55. for(i=1;i<n;i++)
  56. {
  57. s=dis(i,n);
  58. if(Min > res[n][i] + s) Min = res[n][i] + s;
  59. }
  60. return Min;
  61. }
  62.  
  63. int main()
  64. {
  65. int i,j,n,cas;
  66. cin>>cas;
  67. while(cas--)
  68. {
  69. scanf("%d",&n);
  70. vert[1].x=0;
  71. vert[1].y=0;
  72. for(i=2;i<=n+1;i++)
  73. scanf("%d%d",&vert[i].x,&vert[i].y);
  74.  
  75. for(i=1;i<=n+1;i++)
  76. for(j=1;j<=n+1;j++) res[i][j]=INF;
  77.  
  78. printf("%d\n",work(n+1)+n*10);
  79. }
  80. return 0;
  81. }

2014百度之星第二题Disk Schedule(双调欧几里得旅行商问题+DP)的更多相关文章

  1. 2014 百度之星题解 1002 - Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...

  2. 2014年百度之星程序设计大赛 - 资格赛 第二题 Disk Schedule

    双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程 ...

  3. 2014年百度之星资格赛第二题Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取. 然而,在现实中,这样的做法非常复杂. 我们考虑一个相对简单的场景. ...

  4. 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...

  5. 2014百度之星第一题Energy Conversion

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  7. 2014百度之星预赛(第二场)——Best Financing

    2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...

  8. 2014百度之星初赛第二场hdu 4831 Scenic Popularity

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

随机推荐

  1. 343 Integer Break 整数拆分

    给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积.例如,给定 n = 2,返回1(2 = 1 + 1):给定 n = 10,返回36(10 = 3 ...

  2. V-SQL的简单使用

    V-SQL概述: V-SQL,是对同望V3平台时间多数据支持非常重要的基础引擎.因为各个数据库的查询语句的语法有所不同,V-SQL的功能是把查询语句解析为执行系统连接的数据库(MSSQL,Oracle ...

  3. service里设置websocket心跳并向fragment发送数据

    垃圾小白写了自己看的 /** * service 文件 */ public class SocketService extends Service { //自己定义接口用来传参 private sta ...

  4. 【译】x86程序员手册03 - 2.1内存组织和分段

    2.1 Memory Organization and Segmentation 内存组织和分段 The physical memory of an 80386 system is organized ...

  5. 10、scala面向对象编程之Trait

    1.  将trait作为接口使用 2.trait中定义具体方法 3.trait定义具体字段 4.trait中定义抽象字段 5.为实例对象混入trait 6.trait调用链 7.在trait中覆盖抽象 ...

  6. 用sed替换含反斜(\)的字符串

    今天在linux替换配置文件时,test文件里有一个字符串 e:\ 需要换成/usr/home/ 用了sed命令:sed -i "s?e:\\?/usr/home/?g" test ...

  7. Discuz 取消 应用更新提醒 方法

    管理员每次登录论坛,遇有后台没有更新的应用都会有应用更新提醒提醒,而且关了还会继续弹出,问题是有些应用原来我装了免费的,新版本推出来了是 要收费的,我不想要更新,或者是即使有免费的新版本了,而我只要使 ...

  8. 多目标跟踪笔记一:Finding the Best Set of K Paths Through a Trellis With Application to Multitarget Tracking

    Abstract 本文提出一种寻找K最优路径的方法. k最优路径的定义:1.the sum of the metrics of all k paths in the set is minimized. ...

  9. 内核调试-ftrace introduction

    ftrace https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1/ https://www.ibm.com/developerworks/ ...

  10. 【解题报告】 Leapin' Lizards HDU 2732 网络流

    [解题报告] Leapin' Lizards HDU 2732 网络流 题外话 在正式讲这个题目之前我想先说几件事 1. 如果大家要做网络流的题目,我在网上看到一个家伙,他那里列出了一堆网络流的题目, ...