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

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
Source
2014年百度之星程序设计大赛 - 资格赛

AC代码:

本次比赛中最难的一题,一直都在思考一种最优的贪心策略,结果貌似不行;在网上搜了搜,发现是个动态规划问题;

双调欧几里得旅行商问题是一个经典动态规划问题。《算法导论(第二版)》思考题15-1和北京大学OJ2677都出现了这个题目。

旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程。这个解的一般形式为NP的(在多项式时间内能够求出)

J.L. Bentley 建议通过仅仅考虑双调旅程(bitonictour)来简化问题,这样的旅程即为从最左点開始,严格地从左到右直至最右点,然后严格地从右到左直至出发点。下图(b)显示了相同的7个点的最短双调路线。在这样的情况下,多项式的算法是可能的。其实,存在确定的最优双调路线的O(n*n)时间的算法。

上图中,a是最短闭合路线,这个路线不是双调的。b是最短双调闭合路线。


求解过程:

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

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

在定义d(i,j)为满足这一条件的最短路径。我们仅仅考虑i>=j的情况。

同一时候,定义dist(i,j)为点Pi到Pj之间的直线距离。

(3)最优解:我们须要求的是d(n,n)。

关于子问题d(i,j)的求解,分三种情况:

A、当j < i - 1时,d(i,j) = d(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总的不论什么一个。因此须要递归求出最小的那个路径:

d(i,j) = d(i,i-1) = min{d(k,j) + dist(i,k)},当中1 <= k <= j。

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

因此有:

d(i,i) = min{d(i,1)+dist(1,i),...,d(i,i-1),dist(i-1,i)}.。

以上内容来自博文:http://blog.csdn.net/ljd4305/article/details/26099787

以下直接上代码吧
#include<cstdio>
#include<cmath>
#include<algorithm>
#define INF 100*1000*800
#define MAX 1005using namespace std;typedef struct Position
{int t;int s;
}Position;Position p[MAX];
int dp[MAX][MAX];int Distance(int i,int j)//get the distance of track i and track j
{int t=(int)fabs(p[i].t-p[j].t)*400;int s1,s2;if(p[i].s<p[j].s){s1=p[i].s;s2=p[j].s;}else{s1=p[j].s;s2=p[i].s;}int l=s2-s1;int r=360-s2+s1;return (l<r?l:r)+t;
}int solve(int n)
{int ans=INF;int i,j;int dis;dp[2][1]=Distance(2,1);for(i=2;i<=n;i++){for(j=1;j<i;j++){dp[i][j]=min(dp[i][j],dp[i-1][j]+Distance(i-1,i));dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+Distance(j,i));}}for(i=1;i<n;i++){dis=Distance(i,n);if(ans>dp[n][i]+dis)ans=dp[n][i]+dis;}return ans;
}int main(int argc,char *argv[])
{int n,m;scanf("%d",&m);while(m--){scanf("%d",&n);p[1].t=0;p[1].s=0;for(int i=2;i<=n+1;i++)scanf("%d%d",&p[i].t,&p[i].s);for(int i=1;i<=n+1;i++)for(int j=1;j<=n+1;j++)dp[i][j]=INF;printf("%d\n",solve(n+1)+n*10);}return 0;
}

转载于:https://www.cnblogs.com/bhlsheji/p/4004977.html

2014百度之星资格赛——Disk Schedule相关推荐

  1. 2014百度之星资格赛第一道Energy Conversion

    Problem Description 魔法师百小度也有遇到难题的时候--现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力.过了许久,百小 ...

  2. 2014百度之星资格赛第二题

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. 2014 百度之星 资格赛 第一题 Energy Conversion 解题思路

    本次比赛的资格赛似乎比以往来的要稍微难一点,但是整体来说,每道题想到解题思路都不是很难,但是在具体的代码编写过程中需要注意的细节尤为重要.下面先将第一题的题目贴出: [Time Limit: 2000 ...

  4. 2014百度之星资格赛 1001 Energy Conversion(递归)题意不解释

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

  5. [2014百度之星资格赛]

    第一个问题: Energy Conversion Problem Description 魔法师百小度也有遇到难题的时候--如今.百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这样的魔 ...

  6. 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

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

  7. 2014百度之星资格赛—— Xor Sum(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  8. 2014百度之星资格赛解题报告:能量变换

    QAZ的能量变换 题目描述: 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于 ...

  9. 2014百度之星资格赛第一题

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

最新文章

  1. 零基础入门学习python
  2. spring websocket Converters must not be empty
  3. 关于CI的服务器与最佳实践,这里有一些思考 1
  4. 解决pc端浏览器不兼容的问题
  5. DAG的深度优先搜索标记
  6. 同级选择器_10-CSS3选择器详解
  7. Unity3DAI:寻路(1):A星寻路,在Unity上用C#代码实现。
  8. Docker 镜像优化与最佳实践
  9. ubuntu搭建NFS服务 磁盘共享 nfs 搭建
  10. 1024 科学计数法
  11. C - Bone Collector(背包问题)(01背包)
  12. NGN学习笔记3——软交换中的协议1--SIP、SIP-I\SIP-T\BICC
  13. 用手机怎么制作电子版证件照
  14. 扫盲篇:数字签名、数字证书、域名劫持、域名欺骗
  15. matlab可以模拟力学实验吗,基于Matlab GUI的渗流力学虚拟仿真实验平台开发
  16. 百度翻译反向js——破解反爬虫
  17. 【论文阅读】Rethinking the Value of Network Pruning
  18. pygame之display模块
  19. ASP.NET Core 数据保护(Data Protection)【上】
  20. 第二篇 在Arduino IED环境下测试ESP8266模块与外网通信

热门文章

  1. java获取web项目的绝对路径的方法总结
  2. ubuntu使用docker的Huginn上手记
  3. seaborn常用速查手册
  4. spring 源码深度解析_spring源码解析之SpringIOC源码解析(下)
  5. 基于用户长短期表示的新闻推荐
  6. java爬取网页并保存_Java结合WebMagic实现网页内容爬取
  7. Scrapy爬虫框架入门
  8. 4000元性价比主机
  9. pytorch学习笔记(三十七):Adam
  10. [转]Vue生态系统中的库