1594: TomCat的操作系统课
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 58 Solved: 12
[Submit][Status][Web Board]
Description
TomCat是学渣一枚,TomCat上课经常连书都懒得拿,因为TomCat实在不想背着一本比字典还厚的《操作系统》课本。然而,TomCat总是能够神奇的在其他同学没能回答对的问题上作出正确的回答???!!!,然而,这一次,老师在叫了几位同学回答“电梯算法”和电梯的区别….,同学们都没回答正确,接着老师叫到了TomCat,TomCat此时正在神游,根本不知道“电梯算法”是什么鬼。所以就….,TomCat不开心了,现在TomCat想简单模拟“电梯算法”,但是作为学渣,TomCat实在不想动手,于是他告诉你“电梯算法”就是这样的,它是磁盘调度算法,叫做SCAN算法,磁头从磁盘的一端移向另一端,同时当磁头移过每个柱面的时候,会处理该柱面上的服务请求。当到达另一端时,磁头改变移动反向,处理继续。磁头在磁盘上来回扫描。假设柱面的范围是[0,180], 初始磁头在pos位置(磁头总是先往左在往右),给你每个服务的请求时间,以及请求所在的柱面。TomCat需要你计算该请求得到磁头的响应需要的时间。(假设磁头1ms移动一个单位柱面。处理请求时间忽略不计)
Input
第一行磁头0时刻所在的位置pos(pos>=0&&pos<=180) T(T<=100000)个请求
接下来T 行是请求的时间t(t<=100000),请求位于的柱面s(s>=0&&s<=180)
Output
输出请求到被处理的等待时间(单位:ms)
Sample Input
90 2
10 10
5 83
90 2
5 10
10 80
Sample Output
70ms
2ms
75ms
0ms
HINT
Source
/*
WA快到爆炸,开始理解错了请求时间t,WA好几发,然后正确理解请求时间后,推导公式,老想着更快,更简单,又WA好几发~~~~
解题思路:
请求时间t为,只有 时间 到t时 所对应的请求 才会处理,如果到了柱面s(假设耗时x),但是t还没到(x < t),则要直到下一次到柱面s并且t>=x,这个柱面的请求才会被处理,所以到被处理的等待时间就是,ans = x - t(这次(x >=t了)到柱面s总共耗时 - 请求时间);
根据s在pos位置的左边还是右边分为两种情况:
1)s <= pos:
x0 = pos - x;(x0,表示pos第一次到s时耗时)
x1 = x0 + 2*s;(x1表示pos第二次扫描到s时耗时,后面xi类推)
x2 = x1 + 2*(180-s);
x3 = x2 + 2*s;
x4 = x3 + 2*(180-s);
2)s > pos:
x0 = 2*pos + s- pos;
x1 = x0 + 2*(180-s);
x2 = x1 +2*s;
x3 = x2 + 2*(180-s);
...
所以根据上述规律,x算到x >=t时停止
*/
AC_code:
#include<stdio.h>
int main()
{
long long pos,T, t,s,x,r;
while(~scanf("%lld%lld",&pos,&T))
{
while(T--)
{
scanf("%lld%lld",&t,&s);
x = s <= pos ? pos - s : 2 * pos + s - pos;
r = 1;
while(x < t)
{
if(r % 2 != 0)
x += s <= pos ? 2*s : 2*(180-s);
else
x += s <= pos ? 2*(180-s) : 2*s;
r++;
}
printf("%lldms\n",(x-t));
}
}
return 0;
}