题目链接:http://codeforces.com/contest/1082/problem/A
题意是输入n,x,y,d,一本书有n页,当前在第x页,要翻到y页,一次只能向前或向后翻d页,但是不能越界,也就是当前在第2页时,如果要往前翻5页也只能翻到第1页,第n页同理,问最少需要翻几次才能翻到y页,如果翻不到输出-1。
思路就是分三种情况去讨论,一是直接能从x翻到y页,二是翻到第1页然后再翻到y页,三是翻到第n页再翻到y页,判断这三种情况是否可行,可行就输出最小值就好了。
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
ll n,x,y,d;
cin>>n>>x>>y>>d;
ll xx = ceil(1.0 * (x - 1) / d);
ll yy = ceil(1.0 * (n - x) / d);
ll zz = abs(y - x);
ll flag1 = 0, flag2 = 0;
if(zz % d == 0){
printf("%lld\n",zz / d);
}
else{
if((y - 1) % d == 0){
xx += (y - 1) / d;
flag1 = 1;
}
if((n - y) % d == 0){
yy += (n - y) / d;
flag2 = 1;
}
if(flag1 && flag2) cout<<min(xx, yy)<<endl;
else if(flag1 && !flag2) cout<<xx<<endl;
else if(!flag1 && flag2) cout<<yy<<endl;
else puts("-1");
}
}
return 0;
}