1. 程式人生 > >每日一題(01.11)

每日一題(01.11)

Description:

算24點是一個經典的益智遊戲。遊戲目標是對於給定的4 個正整數,多次利用加、減、乘、除運算,最終得到24。
現增加給定數字的數量以及可供使用的運算子。
修改後的遊戲規則如下:
給定一個含有n個自然數的集合,並支援以下操作:
(1)從集合中選擇兩個數 a , b a,b

,將它們從集合中刪除,並向集合中新增以下幾個數中的任意一個:
a + b a b
a × b a / b (
b ! = 0 ) a b l o g a b ( a > 0 a 1 b > 0 ) ①a+b,②a-b,③a\times b,④a/b(b!=0),⑤a^b,⑥log_a{b}(a>0且a\ne1且b>0)

(2)從集合中選擇一個數 a a ,將它從集合中刪除,並向集合中新增以下幾個數中的任意一個:
a ! ( a ) a % a ( a 0 ) a [ a ] ( ) a ( ) ①a!(a為自然數),②a\%,③\sqrt{a}(a\geqslant 0),④|a|,⑤[a](即向下取整),⑥\left \lfloor a \right\rfloor(即向上取整)
當集合中只剩下一個數並且這個數是24 時,遊戲目標達成。
現在給定一個集合 { c 1 , c 2 ,   , c n } \{c_1,c_2,\cdots,c_n\} ,請問是否可以通過若干次操作,達到遊戲目標呢?是則輸出 “Yes”,否則輸出 “No”。

Input:

首先輸入一個正整數T (1<=T<=1000),表示測試資料的組數。
對於每組測試資料,
第一行包含一個正整數n (1<=n<=100),
第二行包含n 個自然數 c 1 , c 2 , &ThinSpace; , c n c_1,c_2,\cdots,c_n (0<= c i c_i <=100) 。

Output:

對於每組測試資料,輸出 “Yes” 或 “No”,表示該組測試資料的答案,每組輸出佔一行。

Sample Input:

2
4
0 0 0 0
4
5 12 15 23

Sample Output:

Yes
Yes

Tips:

對於第一組樣例,一種可行的步驟如下:
{ 0 , 0 , 0 , 0 } { 1 , 0 , 0 , 0 } { 1 , 1 , 0 , 0 } { 1 , 1 , 1 , 0 } { 1 , 1 , 1 , 1 } { 2 , 1 , 1 } { 3 , 1 } { 4 } { 24 } \{0,0,0,0\}\rightarrow\{1,0,0,0\}\rightarrow\{1,1,0,0\}\rightarrow\{1,1,1,0\}\rightarrow\{1,1,1,1\}\rightarrow\{2,1,1\}\rightarrow\{3,1\}\rightarrow\{4\}\rightarrow\{24\}
( 0 ! + 0 ! + 0 ! + 0 ! ) ! = 24 (0!+ 0!+0!+0!)!=24
對於第二組樣例,一種可行的步驟如下:
{ 5 , 12 , 15 , 23 } { 0.05 , 12 , 15 , 23 } { 12 , 23 , 300 } { 276 , 300 } { 576 } { 24 } \{5,12,15,23\}\rightarrow\{0.05,12,15,23\}\rightarrow\{12,23,300\}\rightarrow\{276,300\}\rightarrow\{576\}\rightarrow\{24\}
15 ÷ 5 % + 12 × 23 = 24 \sqrt{15\div 5 \%+12\times 23}=24

Reference Code

#include <stdio.h>
int s[105];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&s[i]);
        }
        if(n==1 && s[1]<=2){
            printf("No\n");
        }
        else{
            printf("Yes\n");
        }
    }
    return 0;
}