10400 -Game Show Math

2024-09-08 00:08
文章标签 math game show 10400

本文主要是介绍10400 -Game Show Math,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题的话利用了暴力深搜,尽管给了20S,但是这样还会超时,所以就需要利用回溯进行减枝,因为是DFS,所以用一个数组vis[i][j]记录是否在状态i时候取到过j值,如果取到过的话,那么直接回溯(往后搜索已经没有意义了,之前到达这个状态的时候是无法得到结果的)

还有需要注意的地方就是题目的要求,每一步的结构都在(-32000,32000)之间,所以需要一步判断,如果在这个范围外直接回溯

最后一点就是由于包含了除法,所以记得要考虑除数为0的情况,否则会RE

网上还有人利用DP思想做的,不过我还没学到这个专题,所以先不做过多的分析了


减枝前后的时间从TEL减到了0.48s,可以看出正确的减枝对程序优化的巨大作用

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100 + 10
#define MAXD 100000
int n,m,ok;
int array[N];
char oper[N];
int vis[N][MAXD];
void solve(int u,int sum){if(ok) return ;if(sum > 32000 || sum < -32000) return ;if(u == n && sum == m){ok = 1;return ;}if(vis[u][sum + 32000]) return ;vis[u][sum + 32000] = 1;if(u == n) return ;oper[u] = '+'; solve(u + 1, sum + array[u]);if(ok) return ;oper[u] = '-'; solve(u + 1, sum - array[u]);if(ok) return ;oper[u] = '*'; solve(u + 1, sum * array[u]);if(ok) return ;if(array[u] != 0){oper[u] = '/'; solve(u + 1, sum / array[u]);if(ok) return ;}
}
int main(){int T;scanf("%d",&T);for(int Case = 1; Case <= T; Case ++){ok = 0;memset(vis,0,sizeof(vis));scanf("%d",&n);for(int i = 0; i < n ; i++)scanf("%d",&array[i]);scanf("%d",&m);solve(1,array[0]);if(ok)for(int i = 0; i < n ; i++){printf("%d",array[i]);if(i  < n - 1) printf("%c",oper[i + 1]);if(i == n - 1) printf("=%d",m);}else printf("NO EXPRESSION");printf("\n");}return 0;
}


这篇关于10400 -Game Show Math的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146558

相关文章

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

07 v-if和v-show使用和区别

划重点: v-ifv-show 小葱拌豆腐 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="

show命令监控分析mysql实例信息

文章目录 思维导图show 查看数据库实例相关信息SHOW VARIABLES 分析数据库当前变量设置分析连接数据分析线程数分析慢查询变量分析缓存相关分析字符集相关 SHOW STATUS 数据库当前实时状态分析分析连接数据分析线程数分析慢查询分析查询缓存分析排序使用情况分析文件打开数mysql 锁分析 思维导图 show 查看数据库实例相关信息 查看当前实例所有数据库

Python的math库——常用数学函数全解析

文末赠免费精品编程资料~~ 一、math模块简介 math 是 Python 内置的一个标准库,它包含了许多执行复杂数学运算的函数,如三角函数、对数函数、指数函数等。 二、常用函数详解与示例 基本数学运算 math.sqrt(x): 计算平方根。 import math# 计算平方根result = math.sqrt(16)print(result) # 输出 4.0 mat

Show,Attend and Tell: Neural Image Caption Generation with Visual Attention

简单的翻译阅读了一下 Abstract 受机器翻译和对象检测领域最新工作的启发,我们引入了一种基于注意力的模型,该模型可以自动学习描述图像的内容。我们描述了如何使用标准的反向传播技术,以确定性的方式训练模型,并通过最大化变分下界随机地训练模型。我们还通过可视化展示了模型如何能够自动学习将注视固定在显着对象上,同时在输出序列中生成相应的单词。我们通过三个基准数据集(Flickr9k,Flickr

Math - Uva 11300 Spreading the Wealth

Spreading the Wealth  Problem's Link  ---------------------------------------------------------------------------- Mean:  n个人围成一圈,每个人手里有Ai个金币,每个人可以给与他相邻的人一些金币,通过一系列的流转后,最后所有人的金币数相等。问整个过程最少需

【POJ】1733 Parity game 并查集

传送门:【POJ】1733 Parity game 题目大意:给你一个长度为n的01序列,再给你m句话,每句话是一个区间【L,R】,告诉你区间【L,R】中1的个数,现在你的任务是找到从第几句话开始说的和前面矛盾,出现第一次假话的时候前面有多少是真话。 题目分析:一开始看几乎没思路啊。后来没办法了,只能跑别人的博客去看看了。。。一看到说把一个区间【L,R】拆成两个区间【0,L-1】,

【HDU】5426 Rikka with Game【DP】

题目链接:【HDU】5426 Rikka with Game #include <bits/stdc++.h>using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )const int MAXN = 100005 ;const int MAXE = 200005 ;

LeetCode 45 Jump Game II

题意: 给出一个步长数组nums,如果一个人站在i这个点上那么他可以向右最多走nums[i]步,求从左端点走到右端点的最少步数。 思路: 如果点x可以用dp[x]步到达,那么[ x + 1, x + nums[x] ]区间内的点都可以用dp[x] + 1步到达。 利用这个想法,可以O(n)的求出走一步可以到达哪些位置,走两步可以到达哪些位置,以此类推。 代码: clas

Math 题目总结

Math的题目,其实全是数学知识,没有什么太多的算法可言。 Sparse Matrix Multiplication (矩阵相乘就是所有的k,A(i,k) * B(k,j) = C(i,j) ,稀疏矩阵就是 有很多0,为了提高速度也就是如果 A(i,k) 或者B(k,j), k 从0到length,如果有0,那么这个计算就不进行了) class Solution {public int[][]