Hihocode 1304

http://hihocoder.com/problemset/problem/1304

题意:就是四个数字加上运算符,看看是否可以构成二十四点。

思路:这个题目肯定是个DFS

搜索是这么搜的,首先有4个数字,排列的话那么就会有4!=24中组合,然后运算符,在运算符号这里,我们进行拓展,也就是由4个运算符拓展成六个运算符,+,-,*,/,~-,~/。

这里的~-意思就是减数和被减数互换一下,~/一样的意思。这样的话,那么我们只有两种组合

(((a ⊙ b) ⊙ c ) ⊙ d)

((a ⊙ b) ⊙ (c ⊙ d))

之后我们进行枚举就可以。

代码有点长,不过看别人的,确实有更加好的办法,这个还是算比较笨的吧。

 1 //最初的梦想,紧握手上
 2
 3
 4 #include <stdio.h>
 5 #include <string.h>
 6 #include <math.h>
 7 #define eps 1e-5
 8 bool used[4];
 9 int num[4];
10 int nownum[4];
11 int ope[3];
12 double judge(double a,double b,int x)    //运算符
13 {
14     switch (x)
15     {
16          case 1:
17             return a+b;
18         case 2:
19             return a-b;
20         case 3:
21             return a*b;
22         case 4:
23             if(fabs(b-0)>eps)
24                 return a/b;
25             else
26                 return -999999;
27         case 5:
28             return b-a;
29         case 6:
30             if(fabs(a-0)>eps)
31                 return b/a;
32             else return -999999;
33     }
34
35 }
36 double jud1()  //第一种判断
37 {
38     return judge(judge(judge(nownum[0],nownum[1],ope[0]),nownum[2],ope[1]),nownum[3],ope[2]);
39
40 }
41
42 double jud2()  //第二种判断
43 {
44     return judge(judge(nownum[0],nownum[1],ope[0]),judge(nownum[2],nownum[3],ope[1]),ope[2]);
45 }
46 bool calc(int deep)    //枚举运算符
47 {
48     if(deep>2)
49     {
50         if(fabs(jud1()-24)<eps)
51             return true;
52         if(fabs(jud2()-24)<eps)
53             return true;
54         return false;
55     }
56     for(int i =1; i<=6; i++)
57     {
58         ope[deep] = i;
59         if(calc(deep+1))
60             return true;
61     }
62     return false;
63 }
64
65 bool dfs(int deep)    //枚举数字
66 {
67     if(deep>3)
68         return calc(0);
69     for(int i = 0; i<4; i++)
70         if(used[i])
71         {
72             used[i] = false;
73             nownum[deep] = num[i];
74             if(dfs(deep+1))
75                 return true;
76             used[i] = true;
77         }
78     return false;
79 }
80
81
82 int main()
83 {
84    // freopen("in.txt","r",stdin);
85     int a,b,c,d;
86     int t;
87     scanf("%d",&t);
88     while(t--)
89     {
90         memset(used,true,sizeof(used));
91         scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]);
92         if(dfs(0))
93             printf("Yes\n");
94         else
95             printf("No\n");
96     }
97     return 0;
98 }
时间: 2024-10-16 04:02:39

Hihocode 1304的相关文章

BZOJ 1304: [CQOI2009]叶子的染色

1304: [CQOI2009]叶子的染色 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 566  Solved: 358[Submit][Status][Discuss] Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结

hihocode 1116 计算 (线段树)

题目链接:hihocode 1116 计算 中文题. (待解决)还没弄明白为什么PushUp()怎么计算,神奇 #include <stdio.h> #include <string.h> #define LL long long const LL kmod=10007; const LL maxn=100010; struct node{ LL l,r; LL sum,all; LL ls,rs; LL mid(){ return (l+r)>>1; } }; str

Enterprise Library - Data Access Application Block 6.0.1304

Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简化了开发实现通用数据访问功能. 应用程序可以使用这个应用程序块在不同的情况下,例如读取数据显示,通过应用程序层传递数据,提交更改的数据的数据库系统. 安装企业库,数据访问应用程序块,运行以下命令 包管理器控制台 PM> Install-Package EnterpriseLibrary.Data h

1304: [CQOI2009]叶子的染色 - BZOJ

Description给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从u到根结点的简单路径上最后一个(应该是最深的那个吧)有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少.Input第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数.结点编号为1,2,-,m,

#错误处理#Error 1304: Error writing to file: Verify that you have access to that directory while upgrading ArcGIS Softwares

When upgrading ArcGIS Server 10.5 and Portal for ArcGIS 10.5 you may encounter following error message: Reason: This error occurs because files utilized while upgrading are detected as a security threat by Anti-virus and Desktop Protection Software, 

bzoj千题计划233:bzoj 1304: [CQOI2009]叶子的染色

http://www.lydsy.com/JudgeOnline/problem.php?id=1304 结论1:根节点一定染色 如果根节点没有染色,选择其子节点的一个颜色,那么所有这个颜色的子节点都不用染色.答案不会更差. 结论2:相邻节点不会染同一种颜色 将深度更大的那个有色节点变成无色仍然满足要求 结论3:任意一个非叶子节点做根,对答案都没有影响. 考虑将原根节点的一个自己点换成根,原来到根最近的颜色节点不变 所以,任取一个非叶子节点做根 dp[x][0/1]表示x染黑/白,使其子树内叶子

hihoCode 1078 : 线段树的区间修改

#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了小Ho: 假设货架上从左到右摆放了N种商品,并且依次标号为1到N,其中标号为i的商品的价格为Pi.小Hi的每次操作分为两种可能,第一种是修改价格——小Hi给出一段区间[L, R]和一个新的价格NewP,所有标号在这段区间中的商品的价格都变成NewP.第二种操作是询问——小Hi给出一段

hihoCode r#1077 : RMQ问题再临-线段树

思路:全都已经介绍了.连步骤它都告诉你了.差的只是实现了.两种实现方法:(1)用链表做树(2)用顺序表做树.顺序表的速度更快,因为不用管链的问题.空间谁更省?树是接近平衡的,也就是叶子节点在最下两层,但是如果树深一点,用顺序表就会浪费很多空间,这底层可能比之前存的都要多,但是链表却每个点都要消耗.总的来讲,顺序表更省,即使浪费了一半,也只是一半乘以4个字节,可是链表就每个节点必须浪费8字节了.但是链表却能应对更多情况. 1 #include <bits/stdc++.h> 2 using na

hihocode 九十七周 中国剩余定理

题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军韩信带领1500名士兵经历了一场战斗,战死四百余人.韩信为了清点人数让士兵站成三人一排,多出来两人:站成五人一排,多出来四人:站成七人一排,多出来六人.韩信立刻就知道了剩余人数为1049人. 小Hi:韩信点兵嘛,这个故事很有名的. 小Ho:我觉得这里面一定有什么巧妙的计算方法!不然韩信不可能这么快计