每日一题(01.11)

Description:

算24点是一个经典的益智游戏。游戏目标是对于给定的4 个正整数,多次利用加、减、乘、除运算,最终得到24。
现增加给定数字的数量以及可供使用的运算符。
修改后的游戏规则如下:
给定一个含有n个自然数的集合,并支持以下操作:
(1)从集合中选择两个数 a , b 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) a+baba×ba/b(b!=0)ablogab(a>0a̸=1b>0)
(2)从集合中选择一个数 a 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(即向上取整) a!(a)a%a (a0)a[a]()a()
当集合中只剩下一个数并且这个数是24 时,游戏目标达成。
现在给定一个集合 { c 1 , c 2 , ⋯   , c n } \{c_1,c_2,\cdots,c_n\} {c1,c2,,cn},请问是否可以通过若干次操作,达到游戏目标呢?是则输出 “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 c1,c2,,cn(0<= c i c_i ci<=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}{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 ! ) ! = 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\} {5,12,15,23}{0.05,12,15,23}{12,23,300}{276,300}{576}{24}
15 ÷ 5 % + 12 × 23 = 24 \sqrt{15\div 5 \%+12\times 23}=24 15÷5%+12×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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值