UVA10400- Game Show Math

题意:给出p个数字,使用+,-,*,/,这四个运算符使得最后结果等于n(四个运算符的优先级相同)

思路:回溯+剪枝,不剪枝的话会TLE。用一个标记数组记录在计算的结果。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

const int MAXN = 32000;
const int N = 105;

int arr[N], vis[N][MAXN * 2 + 5];
int n, m, flag;
char path[N];

bool judge(int cur, int sum) {
    return abs(sum) <= MAXN && !vis[cur][sum + MAXN];
}

void dfs(int cur, int sum) {
    if (flag)
        return;
    if (cur == n) {
        if (sum == m)
            flag = 1;
        return;
    }
    for (int i = 0; i < 4; i++) {
        if (i == 0 && judge(cur, sum + arr[cur])) {
            vis[cur][sum + arr[cur] + MAXN] = 1;
            path[cur] = '+';
            dfs(cur + 1, sum + arr[cur]);
        }
        if (i == 1 && judge(cur, sum - arr[cur])) {
            vis[cur][sum - arr[cur] + MAXN] = 1;
            path[cur] = '-';
            dfs(cur + 1, sum - arr[cur]);
        }
        if (i == 2 && judge(cur, sum * arr[cur])) {
            vis[cur][sum * arr[cur] + MAXN] = 1;
            path[cur] = '*';
            dfs(cur + 1, sum * arr[cur]);
        }
        if (i == 3 && arr[cur] != 0 && judge(cur, sum / arr[cur])) {
            vis[cur][sum / arr[cur] + MAXN] = 1;
            path[cur] = '/';
            dfs(cur + 1, sum / arr[cur]);
        }
        if (flag)
            return;
    }
}

void outPut() {
    for (int i = 0; i < n; i++) {
        if (i)
            printf("%c%d", path[i], arr[i]);
        else
            printf("%d", arr[i]);
    }
    printf("=%d\n", m);
}

int main() {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d", &arr[i]);
        scanf("%d", &m); 

        memset(vis, 0, sizeof(vis));
        vis[0][arr[0] + MAXN] = 1;
        flag = 0;
        dfs(1, arr[0]); 

        if (flag)
            outPut();
        else
            printf("NO EXPRESSION\n");
    }
    return 0;
}

UVA10400- Game Show Math,布布扣,bubuko.com

时间: 2024-11-08 22:23:29

UVA10400- Game Show Math的相关文章

uva10400 - Game Show Math(回溯+剪枝)

题目:uva10400 - Game Show Math(回溯+剪枝) 题目大意:给出N个数,并且给出一个目标数值,要求用上面的数字(全部),并且顺序不能乱,然后用+-*/这些操作,问最终能不能得到目标数值.这里要注意给出的数会在[-32000,32000]之间, 并且要用除法的时候,只有在能整除的时候才能用.并且中间计算结果不能超过[-32000,32000]范围.如果超过这个操作不能做. 解题思路:回溯加剪枝,将每一层计算的结果都保存下来,如果在同一层发现值出现过,并且之前计算发现这样往后是

A Math Problem

A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 237    Accepted Submission(s): 117 Problem Description You are given a positive integer n, please count how many positive integers

数组、Math、JOSN总结

json对象: 1.数组有length属性[尽量使用for循环] 2.而json没有length属性[可以使用for...in...循环] 3.for in 不能遍历页面中的节点对象. for ( var key in json4 ) { alert( key ); alert( json4[key] );}//使用方括号[]取键名,for和for in 可以相互嵌套. delete objName.key : [对象名.要删除的属性名] 在数据传输流程中,json是以文本,即字符串的形式传递的

常用工具类(System,Runtime,Date,Calendar,Math)

一.Sy 一个java.lang包中的静态工具类. 三大字段: static PrintStream err "标准"错误输出流. static InputStream in "标准"输入流. static PrintStream out "标准"输出流. 其他常用方法: 描述系统信息: 获取系统属性信息: static Properties getProperties(): (Properties是Hashtable的子类,也就是Map 的子类

JavaScript中的Math

//math() //Pl document.write(Math.PI+'<br>'); var math=10.1; var math1=10.9; //四舍五入round() document.write(Math.round(math)+'<br>'); //进一法  ceil document.write(Math.ceil(math)+"<br>"); //退一法  floor document.write(Math.floor(math

javascript类型系统——Math对象

× 目录 [1]常量 [2]函数 前面的话 javascript使用算术运算符实现基本的算术运算,如果要实现更加复杂的算术运算,需要通过Math对象定义的常量和函数来实现.和其他对象不同,Math只是一个静态对象,而并没有Math()构造函数.实际上,Math只是一个由Javascript设置的对象命名空间,用于存储数学常量和函数.本文将详细介绍Math对象 new Math();//Uncaught TypeError: Math is not a constructor 常量 Math对象一

LeetCode 50 Pow(x, n)(Math、Binary Search)(*)

翻译 实现pow(x, n). 原文 Implement pow(x, n). 分析 首先给大家推荐维基百科: zh.wikipedia.org/wiki/二元搜尋樹 en.wikipedia.org/wiki/Binary_search_tree 其次,大家也可以看看类似的一道题: LeetCode 69 Sqrt(x)(Math.Binary Search)(*) 然而这题我还是没有解出来,看看别人的解法-- class Solution { private: double myPowHel

Math类

java提供了基本的+,-,*,/算数运算符,同时也提供了更复杂的运算符,比如三角函数,对数元,指数运算 Math是一个工具类.它的构造器被定义为private,因此无法创建Math类的对象,Math类中的所有方法都是 类方法,可以直接通过类名来调用,Math除了提供了大量的静态方法,还提供了两个类变量PI和E public class MathTest{ public static void main(String[] args){ //将弧度转化成角度 System.out.println(

uva 1489 - Math teacher&#39;s homework(数位dp)

题目链接:uva 1489 - Math teacher's homework 题目大意:给定n,k,以及序列m1,m2,-,mn, 要求找到一个长度为n的序列,满足0<=xi<=mi, 并且x1XORx2XOR-XORxn=k 解题思路:数位dp,在网上看了别人的代码,高大上... 假设有二进制数 k : 00001xxxx mi:0001xxxxx, 那么对于xi即可以满足任意的x1XORx2XOR-XORxi?1XORxi+1XOR-XORxn,根据这一点进行数位dp. dp[i][j]

python 实现 math.log(x,base)

python 用闭包实现math.log(x,base) #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys,math import random import pprint def log(n,d): i = 0 status = 0 while True: if d**i==n: status=1 break elif d**i<n<d**(i+1): break i+=1 def test(level=100): if status