n歲的定義:過了n歲的生日,但還沒過n+1歲的生日,這個期間,都是n歲。 由題目可知 (1)Spot s歲時,Puff出生。 (2)Puff p歲時,Yertle出生。 (3)Spot y歲時,Yertle出生。 (4)Dick + Jane = Spot + Puff + Yertle 由(1)(2)(3)可知大小順序: Spot > Puff > Yertle。 以年紀最小的Y往上推: (a)當Y x歲時,P為 x+p歲或 x+p + 1歲。 (b)當Y x歲時,S為 x+y歲或 x+y + 1歲。 由(a)(b)可得總歲數sum的所有可能情況: x + (x+p) + (x+y) x + (x+p) + (x+y+1) x + (x+p+1) + (x+y) x + (x+p+1) + (x+y+1) 由sum求x: sum = 12(d歲) + j歲 = 3x + p + y + (0or1or2) x = [(12+j) - p - y - (0or1or2)] / 3 以下分別解釋每種情況。 第一種:x = [(12+j) - p - y - 0] / 3 歡樂解,直接輸出S、P、Y的年齡:x+y、x+p、x 第二種:x = [(12+j) - p - y - 1] / 3 (12+j) - p - y要減1之後才能被3整除, 所以用3對(12+j) - p - y取餘數,一定餘1。 餘1的情況有兩種:S+1或P+1。 由(a)(1)可以推導出 (c)當P x+p歲時 ,S為(x+p) + s歲或(x+p) + s + 1歲。 (d)當P x+p+1歲時,S為(x+p+1) + s歲或(x+p+1) + s + 1歲。 (d)是P+1的情況,所以(c)一定是S+1,把兩式化簡再跟(b)做比較: (c)當P x+p歲時 ,S為(x+p) + s + 1 = x+y+1 (d)當P x+p+1歲時,S為(x+p+1) + s = x+y 刪x (c)當P x+p歲時 ,S為p + s + 1 = x+y+1 (d)當P x+p+1歲時,S為p+1 + s = x+y 最後可得 (c)p + s = y (d)p + s + 1 = y 所以判斷p + s是否等於y,就能知道是S+1或P+1。 第三種:x = [(12+j) - p - y - 2] / 3 減2才能被3整除,所以用3對(12+j) - p - y - 2取餘數 會餘2。即S、P要各+1再輸出。 打字好多好累 -_-| 簡單講,就是Y x歲生日時,S跟P可能生日過了(各+1), 或是其中一個過了(S+1 or P+1),或是都還沒過。
/** /* ACM 10257 * mythnc * 2011/10/15 20:11:27 * run time: 0.004 */ #include <stdio.h> int main(void) { int s, p, y, j, x; /* x: Yertle's age */ while (scanf("%d %d %d %d", &s, &p, &y, &j) == 4) { x = (12 + j - p - y) / 3; switch((12 + j - p - y) % 3) { case 0: printf("%d %d %d\n", x + y, x + p, x); break; case 1: if (s + p == y) printf("%d %d %d\n", x + y + 1, x + p, x); else printf("%d %d %d\n", x + y, x + p + 1, x); break; case 2: printf("%d %d %d\n", x + y + 1, x + p + 1, x); break; } } return 0; }
沒有留言:
張貼留言