Codeforces 1082A. Vasya and Book

当时真是wa的怀疑人生了,结果结束就知道错在哪里了。。。
给n,x,y,d注意y有可能比x小,一步走d个距离,临近1或n不满的话直接就到1或n,然后问你能不能从x走到y,如果有,输出最小的步数。
首先,x == y 时肯定是0,
其次,|x-y|%d==0 时肯定是|x-y|/d;
再其次,若d>=n,若y!=1&&y!=n,则肯定是-1
最后看由x到1然后1到y 和由x到n然后n到y这两种方法,比较一下就ac了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int t,x,y,d,n;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	//freopen("data.in","r",stdin);
	//freopen("data.out","w",stdout);
	cin>>t;
	while(t--){
		cin>>n>>x>>y>>d;
		if(x == y){
			cout<<0<<endl;
			continue;
		}
		if(d>=n && y != n&&y != 1){
			cout<<-1<<endl;continue;
		}
		if((abs(y-x))%d == 0) cout<<abs(y-x)/d<<endl;
		else {
			if((y-1)%d!= 0&&(n-y)%d != 0)
				cout<<-1<<endl;
			else if((y-1)%d== 0&&(n-y)%d == 0)cout<<min((x-2)/d+1+(y-1)/d,(n-x-1)/d+1+(n-y)/d)<<endl; 
			else if((y-1)%d == 0 )cout<<(x-2)/d+1+(y-1)/d<<endl;
			else if((n-y)%d ==0 ) cout<<(n-x-1)/d+1+(n-y)/d<<endl;
		} 
	} 
	return 0; 
} 	

猜你喜欢

转载自blog.csdn.net/winhcc/article/details/84638312
今日推荐