uva10344 - 23 out of 5

Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23.
For this problem we will only consider arithmetic expressions of the following from:

 
where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
and  {+,-,*} (1<=i<=4)

Input

The Input consists of 5-Tupels of positive Integers, each between 1 and 50.

Input is terminated by a line containing five zero‘s. This line should not be processed.

Output

For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".

Sample Input

1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0

Sample Output

Impossible
Possible
Possible

 

// 题意:输入5个整数,按照某种顺序排列后依次进行+, -或者*,使得最终结果为23。判断是否有解

// 算法:回溯

time 1.692

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[5];
int b[5];
char op[5];
int vis[5];
int possible;

void dfs(int d, int s)
{
    if(d==5)
    {
        if(s==23)
        {
            possible=1;
#ifndef ONLINE_JUDGE
            printf("(((%d ", b[0]);
            for(int i=1;i<4;i++)
                printf("%c %d) ", op[i], b[i]);
            printf("%c %d ", op[4], b[4]);
            printf("\n");
#endif
        }

        return;
    }

    for(int i=0;i<5;i++)
    {
        //第一个数
        if(d==0)
        {
            if(!vis[i])
            {
                vis[i]=1;
                b[d]=a[i];
                dfs(d+1, a[i]);
                vis[i]=0;
            }
        }
        else
        {
            if(!vis[i])
            {
                vis[i]=1;
                b[d]=a[i];
                op[d]=‘+‘;
                dfs(d+1, s+a[i]);
                op[d]=‘-‘;
                dfs(d+1, s-a[i]);
                op[d]=‘*‘;
                dfs(d+1, s*a[i]);
                vis[i]=0;
            }
        }
    }
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("./uva10344.in", "r", stdin);
#endif
    while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5
            && (a[0] || a[1] || a[2] || a[3] || a[4]))
    {
        possible=0;
        dfs(0, 0);
        if(possible)
            puts("Possible");
        else
            puts("Impossible");
    }

    return 0;
}

找到后立刻返回,time 0.945

学习点,dfs时判断扩展点的返回值,如果已经成功,就直接返回。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[5];
int vis[5];

bool dfs(int d, int s)
{
    if(d==5)
        return s==23;

    for(int i=0;i<5;i++) if(!vis[i])
    {

        vis[i]=1;
        //第一个数
        if(d==0) { if(dfs(d+1, a[i])) return true; }
        else
        {
            if(dfs(d+1, s+a[i])) return true;
            if(dfs(d+1, s-a[i])) return true;
            if(dfs(d+1, s*a[i])) return true;
        }
        vis[i]=0;
    }
    return false;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("./uva10344.in", "r", stdin);
#endif
    while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5
            && (a[0] || a[1] || a[2] || a[3] || a[4]))
    {
        memset(vis, 0, sizeof(vis));
        if(dfs(0, 0))
            puts("Possible");
        else
            puts("Impossible");
    }

    return 0;
}

 

next_permutation 计算差点超时: 2.388

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[5];

bool check(int k)
{
    int s=a[0];
    for(int j=1;j<5;j++)
    {
        switch(k%3)
        {
            case 0:
                s+=a[j]; break;
            case 1:
                s-=a[j]; break;
            case 2:
                s*=a[j]; break;
        }
        k/=3;
    }
    return s==23;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("./uva10344.in", "r", stdin);
#endif
    while(scanf("%d%d%d%d%d", a, a+1, a+2, a+3, a+4)==5
            && (a[0] || a[1] || a[2] || a[3] || a[4]))
    {
        sort(a, a+5);
        int ok=0;
        do
        {
            for(int i=0;i<81;i++) if(check(i))
            {
                ok=1;
                break;
            }
        }while(!ok && next_permutation(a, a+5));
        if(ok)
            puts("Possible");
        else
            puts("Impossible");
    }

    return 0;
}

uva10344 - 23 out of 5

时间: 2024-11-10 20:38:55

uva10344 - 23 out of 5的相关文章

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

IE6 浏览器常见兼容问题 共23个

1.<!DOCTYPE HTML>文档类型的声明. 产生条件:IE6浏览器,当我们没有书写这个文档声明的时候,会触发IE6浏览器的怪异解析现象: 解决办法:书写文档声明. 2.不同浏览器当中,很多的标签的默认样式不同,如默认的外部丁内补丁. 产生条件:不同浏览器: 解决办法:利用CSS reset文件进行样式的清除,然后再根据需要进行设置. 3.横向双倍外边距 产生条件:在IE6中块元素浮动后,会出现横向双倍margin现象. 解决办法: 在float标签的样式控制中加入display:inl

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

赛门铁克23亿美元打造全球最大数字安全平台

作者:茱莉叶 [IT战略家] 赛门铁克打造全球最大数字安全平台   赛门铁克周日同意以23亿美元收购消费者身份防窃取保护服务商LifeLock,打造"全球最大的消费者和家庭数字安全平台",扩展赛门铁克的消费者系列产品. 赛门铁克采用现金和7.5亿美元新债务的形式,以每股24美元,高于LifeLock上周五收盘价16%的价格进行收购.截至上周五,LifeLock股价在2016年上涨了45%,市值达到约19.5亿美元.该交易预计将于2017年第一个季度完成.赛门铁克的董事会也将公司的股票回

2016.10.23大型在职研究生招生说明会

气温骤降,金秋已值,一年一度的十月攻坚战开始了.伴随着在职研究生新政的颁布,北京地区各大院校在职研究生的新简章轮番更新,给很多准备报考在职研究生的学员带来了各种混乱以及忐忑. 正巧,2016年秋季大型在职研究生招生说明会即将在北京国家图书馆召开.不管你对在职研究生有多少疑问,这次会议都会给你一个完美的解释. 10月23日北京地区大型在职研究生招生说明会有必要去吗?去了以后真的能解决所有疑惑吗? 其实啊,我们在9月17日已经成功举办了一次北京大型在职研究生说明会,通过9.17说明会的完美收官总结一

Fedora 23如何安装LAMP服务器

LAMP 是开源系统上 Web 服务器的梦幻组合.LAMP 是 Linux. Apache HTTP 服务. MySQL/MariaDB 数据库和 PHP. Perl 或 Python 的简称. 下面教你如何在 Fedora 23 服务器上安装 LAMP 组合. 下面的教程默认使用 192.168.1.102/24 实例,请按照你的服务器做修改. 安装 Apache Apache 是一款开源的 web 服务框架.完全支持 CGI, SSL. 切换到 root 账户: su Fedora 23/2

4.26日第14次作业,23章项目整体绩效评估,24-32章信息安全相关知识

一.23章:项目整体绩效评估 1.三E审计是什么的合称?(记)P524 答:三E审计是经济审计.效率审计和效果审计的合称,因为三者的第一个英文字母均为E,顾称为三E审计. 2.霍尔三维结构是从哪三个方面考察系统工程的工作过程的?P527-528 答:霍尔三维结构是霍尔(A Hall)提出的关于系统方法论的结构,它从逻辑.时间.知识三方面考察系统工程的工作过程. 3.投资回收期的公式?(记,并理解)P533答:投资回收期的公式:(累计净现金流量出现正值的年份-1) + (上年累计净现金流量值的绝对

3月23日 项目管理师作业

一.项目进度管理1.进度管理包括哪六个过程?1.活动定义 2活动排序 3活动资源估算 4活动历时估算 5制定进度计划 6进度控制 2.什么是滚动式规划?滚动式回话就是规划逐步完善的一种表现形式,近期要完成的工作在工作分解结构最下层详细规划,而计划在远期完成的工作分解结构组成部分的工作,在工作分解结构较高层规划 3.什么是控制账户.规划组合?控制账户是指高层管理人员的控制点可以设在工作分解结构工作组合层次以上选定的管理点上.在上位规划有关的工作组合时,这些控制点用做规划的基础 规划组合是指规划组合