1. 程式人生 > >Educational Codeforces Round 55 (Rated for Div. 2) A - Vasya and Book

Educational Codeforces Round 55 (Rated for Div. 2) A - Vasya and Book

傳送門

https://www.cnblogs.com/violet-acmer/p/10035971.html

 

題意:

  一本書有n頁,每次只能翻 d 頁,問從x頁到y頁需要翻動幾次?

  注意:往前翻最少翻到第1頁,往後翻最多翻到n頁。

題解:

  一開始想找規律來著,emmmm,直接用廣搜,當時竟然過了,第二天,加資料了,直接就TLE了。

  然後,今天下午,mxl給我和lk講了一下ta的做法,找的規律,啊啊啊,我竟然沒想到。

  規律:

  (1):如果abs(x-y)%d == 0,那麼,那麼直接輸出abs(x-y)/d;

  (2):如果abs(x-y)%d != 0,並且(y-1)%d != 0 && (n-y)%d != 0,輸出-1。

      對(2)的理解:如果abs(x-y)%d != 0,說明不可能從x直接翻到y,那麼,只能通過從 x ->1 -> y 或 x -> n -> y了,但如果1不能翻到y並且n也不能翻到y,那肯定

    就不會從x翻到y了,所以輸出-1。

  (3):如果前兩種情況都不滿足,說明 x 可以通過 (x ->1 -> y) 或 (x -> n -> y) 翻到y,然後,只需輸出兩中方式的最少翻動的次數即可。

AC程式碼:

 1 #include<iostream>
 2 #include<cstdio>
 3
#include<cstdlib> 4 #include<cmath> 5 using namespace std; 6 #define INF 0x3f3f3f3f 7 8 int n,x,y,d; 9 10 int Solve() 11 { 12 int sub=abs(x-y);//規律(1) 13 if(sub%d == 0) 14 return sub/d; 15 if((y-1)%d != 0 && (n-y)%d != 0)//規律(2) 16 return -1; 17 18 int
xToOne=(x-1)/d+((x-1)%d == 0 ? 0:1); 19 int oneToY=((y-1)%d == 0 ? (y-1)/d:INF);//注意:此處是判斷能否有1到y,如果不能,賦值為INF 20 21 int xToN=(n-x)/d+((n-x)%d == 0 ? 0:1); 22 int nToY=((n-y)%d == 0 ? (n-y)/d:INF);//同上 23 24 return min(xToOne+oneToY,xToN+nToY);//規律(3) 25 } 26 int main() 27 { 28 int t; 29 scanf("%d",&t); 30 while(t--) 31 { 32 scanf("%d%d%d%d",&n,&x,&y,&d); 33 printf("%d\n",Solve()); 34 } 35 return 0; 36 }
View Code