思维水题
题目意思:
一本书有1到n页,起始页数是x,
一次翻页只能翻d(向前或者向后翻,但是不能翻出去,例如n=5,x=1 y=5,d=10 ) 这种情况下是可以翻页到5的。
问能否翻y页。否输出-1,能则输出从x到y所需的最少翻页次数
思路:
1. x能直接到y。
2. 起点x非1且非n,同时d>=n。
3. x先到1,再到y。
4. x先到n,再到y。
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<set> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define Swap(a,b,t) t=a,a=b,b=t #define Mem0(x) memset(x,0,sizeof(x)) #define Mem1(x) memset(x,-1,sizeof(x)) #define MemX(x) memset(x,0x3f,sizeof(x)) using namespace std; typedef long long ll; const ll inf=0xfffffffff; const double eps=1e-12; int main() { int t; cin>>t; while(t--){ ll n,x,y,d; cin>>n>>x>>y>>d; if (x==y){ printf("0\n"); continue; } else if (abs(x-y)%d==0){ printf("%d\n",abs(x-y)/d); continue; } else if ((y!=1&&y!=n)&&d>=n){ printf("-1\n"); continue; } else{ //x->1->y ll ans1=0,ans2=0,ans; ans1=ans1+(x-1)/d; if ((x-1)%d!=0){ ans1+=1; } if ((y-1)%d!=0) ans1=inf; else ans1=ans1+(y-1)/d; //x->n->1 ans2=ans2+(n-x)/d; if ((n-x)%d!=0) ans2++; if((n-y)%d!=0) ans2=inf; else ans2=ans2+(n-y)/d; // printf("%lld\n\n",ans2); ans=min(ans1,ans2); if (ans==inf) printf("-1\n"); else printf("%lld\n",ans); // printf("inf=%lld",inf); } } return 0; }