题目链接: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;
}