hihoCoder 搜索一·24点
题目1 : 搜索一·24点
描述
周末,小Hi和小Ho都在家待着。在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。小Ho:玩点什么好呢?小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。小Ho:好啊,好啊。<经过若干局游戏之后>小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?小Hi:让我想想。<过了几分钟>小Hi:我知道了!其实很简单嘛。提示:24点
输入
第1行:1个正整数, t,表示数据组数,2≤t≤100。第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。
输出
第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出"Yes",否则输出"No"。
- 样例输入
-
2 5 5 5 1 9 9 9 9 - 样例输出
-
Yes No
刚开始使用搜索枚举出所有类型,然后怎么算也没办法算出5 5 5 1是怎么样得出24点的,如果那个时候知道了要考虑浮点数,就不会有下面这种方法解题啦!o(╯□╰)o![]()
提示中说:枚举所有数字与运算符,然后通过
(((a ⊙ b) ⊙ c ) ⊙ d) ((a ⊙ b) ⊙ (c ⊙ d))
这两种类型的式子计算,首先我们可以想一想,如果枚举所有数字的话,普通枚举一定会出现重复的情况,比如5 5 5 1,这组数中有3个5存在,即使全部枚举也不会超时,但是,更重要的是算法优化嘛!C++中刚好提供了这么一个函数,
next_permutation(a,a+4); //操作对象是数组a前四位
它是用来把一个数组(或容器)生成下一排列。此处是递增排列,也就是1 2 3 4的下一排列是1 2 4 3另外还有一个与之类似的函数是
prev_permutation(a,a+4); //操作对象是数组a前4位
使用这两个函数不就不会出现那种重复枚举的情况啦!不过首先要对数组进行排序
现在数字枚举的问题解决啦!
然后就是运算符枚举了!这样的话既然有三个位置需要填充运算符,我们可以用一个三重循环来枚举所有的情况,然后针对每一种情况计算所得出的结果!
如果答案是24,直接停止枚举。输出"Yes",否则输出"No"。
Over
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
double a[4];
bool flag;
double so(double a,double b,int k)
{
double s=0.0;
switch(k)
{
case 0:s=a+b;break;
case 1:s=a-b;break;
case 2:s=a*b;break;
case 3:if(b!=0)s=a/b;break;
case 4:s=b-a;break;
case 5:if(a!=0)s=b/a;break;
}
return s;
}
bool pan(int i,int j,int k)
{
if(so(so(so(a[0],a[1],i),a[2],j),a[3],k)==24)return true;
if(so(so(a[0],a[1],i),so(a[2],a[3],k),j)==24)return true;
return false;
}
void solve()
{
for(int i=0; i<6; i++)
for(int j=0; j<6; j++)
for(int k=0; k<6; k++)
if(pan(i,j,k))
{
flag=true;
return;
}
}
int main()
{
int N;
cin>>N;
while(N--)
{
flag=false;
for(int i=0; i<4; i++)
cin>>a[i];
sort(a,a+4);
do
{
solve();
if(flag)break;
}
while(next_permutation(a,a+4));
if(flag)printf("Yes\n");
else printf("No\n");
}
return 0;
}
hihoCoder 搜索一·24点的更多相关文章
- hihocoder 九十八周 搜索一 24点
题目1 : 搜索一·24点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着. 在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副 ...
- hiho一下 第九十八周 搜索一·24点
题目1 : 搜索一·24点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着. 在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副 ...
- 【hihocoder 1304】搜索一·24点
[题目链接]:http://hihocoder.com/problemset/problem/1304 [题意] [题解] 按照题目给的方法搜索就好; 那个方法很棒啊. 注意除0; 然后是浮点数的比较 ...
- hihoCoder搜索二·骑士问题
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> ...
- 在Hadoop分布式文件系统的索引和搜索
FROM:http://www.drdobbs.com/parallel/indexing-and-searching-on-a-hadoop-distr/226300241?pgno=3 在今天的信 ...
- ASP.NET MVC+Bootstrap个人博客之后台dataTable数据列表(五)
jQuery dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器分页.查询.格式化等功能.dataTables 官网也提供了大量的演示 ...
- 转:selenium webdriver 执行javascript代码
在用selenium webdriver 编写web页面的自动化测试代码时,可能需要执行一些javascript代码,selenium本身就支持执行js,我们在代码中import org.openqa ...
- 09_Python定义方法_Python编程之路
有关Python判断与循环的内容我们上几节已经跟大家一起学习了,这一节我们主要针对def 做一个讲解 def 定义一个方法 在项目编程中,我们往往要做很多重复的事,比如一个排序的功能(当然Python ...
- Mac 上有哪些鲜为人知且极大提高效率的工具?
来源:知乎文章收录于:风云社区SCOEE,提供上千款各类mac软件下载 1. Focus 功能: 屏蔽影响你学习的网站. 同类软件:Self Control, Rescue Time 特点 ...
随机推荐
- vmware 共享文件夹 win7 centos6
1. 安装 vmware-tools 1). 右击虚拟机 -- 安装vmware-tools 2). 挂载 mnt /dev/cdrom /mnt 3). yum -y install gcc gcc ...
- mysql:on duplicate key update与replace into
在往表里面插入数据的时候,经常需要:a.先判断数据是否存在于库里面:b.不存在则插入:c.存在则更新 一.replace into 前提:数据库里面必须有主键或唯一索引,不然replace into ...
- 安装windowbuilder错误一例
eclipse是3.7版本,安装了windowbuilder,大致步骤如下: http://www.cnblogs.com/gladto/archive/2011/07/21/2112836.html ...
- spring AutowireCapableBeanFactory 自动注入
文档:http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/Auto ...
- Effective C++ 6.继承与面向对象设计
//条款32:确定你的public继承塑模出is-a关系 // 1.public继承意味着is-a的关系,适用在基类上的方法都能用于派生类上. //条款33:避免遮掩继承而来的名称 // 1.在pub ...
- 树形DP(01组合背包The Ghost Blows Light HDU4276)
题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...
- Linux 硬盘分区
Linux系统中的重要概念,一切资源都看做是文件,包括硬件设备. 1. 基本概念 1)MBR:Master Boot Recorder,存放主引导记录,446字节的引导代码. 2)主分区表:存放主分区 ...
- 数据库 SQL基础
数据库是用来存取数据的. 数据库类型: ACESS(比较小,存储少) SQL SERVER (.net) MySQL Oracle(java) 数据库:服务.界面 服务是可以操作的后台的程序. 界面是 ...
- Java基础(5):试用Array类对数据进行操作(Sort和toString方法)
Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等 1. 排序 语法: Arrays.sort(数 ...
- Android异步任务AsyncTask
package com.example.asynctask; import java.net.MalformedURLException; import java.net.URL; import an ...