小杰翻书
时间: 1ms 内存:128M
描述:
小杰正在读一本电子书。 该书的文件由n页组成,编号从1到n。 屏幕当前显示页面x的内容,小杰想要读取页面y。 书上有两个按钮,允许小杰向前或向后滚动d页(但他不能在书外滚动)。 例如,如果书由10页组成,并且d = 3,那么从第一页开始,小杰可以通过按下其中一个按钮滚动到第一页或第四页; 同理从第二页可以到第一页或第五页; 从第六页到第三页或第九页; 从第八到第五页或第十页。
帮助小杰计算按下按钮移动到第y页所需的最少次数。
输入:
输入一个整数 t (1≤t≤103),代表样例数目
每一个样例有四个整数 n, x, y, d (1≤n,d≤109, 1≤x,y≤n) ,中间用空格分开,分别表示电子书的总页数,当前页数,要到达的页数,每次滚动的页数
输出:
如果小杰能够从x页翻到y页的话,就输出最少按动按钮次数,否则输出-1
示例输入:
3
10 4 5 2
5 1 3 4
20 4 19 3
示例输出:
4
-1
5
提示:
参考答案(内存最优[1120]):
#include<stdio.h>
int main()
{
int t;
int n,x,y,d,ans;
scanf("%d",&t);
while(t>0)
{
scanf("%d%d%d%d",&n,&x,&y,&d);
int a;
if(x<y)
a=y-x;
else
a=x-y;
if(a%d==0)
ans=a/d;
else if(a%d!=0)
{
int cnt=0;
if((y-1)%d==0)
{
if((x-1)%d==0)
cnt=(x-1)/d;
else
cnt=(x-1)/d+1;
ans=cnt+(y-1)/d;
}
else if((n-y)%d==0)
{
if((n-x)%d==0)
cnt=(n-x)/d;
else
cnt=(n-x)/d+1;
ans=cnt+(n-y)/d;
}
else
ans=-1;
}
printf("%d\n",ans);
t--;
}
return 0;
}
参考答案(时间最优[2]):
#include<stdio.h>
int main()
{
int t;
int n,x,y,d,ans;
scanf("%d",&t);
while(t>0)
{
scanf("%d%d%d%d",&n,&x,&y,&d);
int a;
if(x<y)
a=y-x; else
a=x-y;
if(a%d==0)
ans=a/d; else if(a%d!=0)
{
int cnt=0;
if((y-1)%d==0)
{
if((x-1)%d==0)
cnt=(x-1)/d; else
cnt=(x-1)/d+1;
ans=cnt+(y-1)/d;
} else if((n-y)%d==0)
{
if((n-x)%d==0)
cnt=(n-x)/d; else
cnt=(n-x)/d+1;
ans=cnt+(n-y)/d;
} else
ans=-1;
}
printf("%d\n",ans);
t--;
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。