2012-08-16 09:05:19Morris
[ZJ] a264. 骰子疊疊樂
內容 :
骰子!疊疊樂!!
要怎樣才能用最少的骰子疊成一疊
使得表面的總和恰好為 n 呢 ~
噢你在透明的桌面上,所以最下面的點數也算在表面
輸入說明
:
多組輸入,以EOF作為結束
每組輸入為一個正整數 n (1<=n<=1000000000)
輸出說明
:
一個數字,代表至少要用幾個骰子才能疊出 n
無解請輸出 -1
範例輸入 :
50 7 32
範例輸出 :
3 -1 2
提示
:
32 = (1+2+3+4+6)*2 = 兩顆骰子五對五疊起來 //(1+2+3+4+5) + (1+2+3+5+6)也可以
出處
:
(管理:VacationClub)
很明顯的你會發現中間的骰子是對稱的兩面點數消失, 也就是 7 點,
那麼你可以歸納出 1 顆骰子 21, 2顆骰子 30~40, 3顆 44~54,
範圍都是 10, 而起始的點數公差都是 14
#include <stdio.h>
int main() {
int n;
while(scanf("%d", &n) == 1) {
if(n < 21) puts("-1");
else if(n == 21) puts("1");
else {
if(n < 30) puts("-1");
else {
int m = (n-30)/14*14 + 30;
if(n >= m && n <= m + 10)
printf("%d\n", (n-30)/14+2);
else
puts("-1");
}
}
}
return 0;
}
很明顯的你會發現中間的骰子是對稱的兩面點數消失, 也就是 7 點,
那麼你可以歸納出 1 顆骰子 21, 2顆骰子 30~40, 3顆 44~54,
範圍都是 10, 而起始的點數公差都是 14
#include <stdio.h>
int main() {
int n;
while(scanf("%d", &n) == 1) {
if(n < 21) puts("-1");
else if(n == 21) puts("1");
else {
if(n < 30) puts("-1");
else {
int m = (n-30)/14*14 + 30;
if(n >= m && n <= m + 10)
printf("%d\n", (n-30)/14+2);
else
puts("-1");
}
}
}
return 0;
}