[HDOJ5938]Four Operations(暴力,DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5938

题意:给出一个长度最大是2020的数字串, 你要把数字串划分成55段, 依次填入’+’, ’-’, ’*’, ’/’, 问能得到的最大结果。

想让这个结果最大,那尽可能让减号左边的数最大,只需要关心左边的第一位是一个数还是最后一位是一个数,后面的枚举*和/的位置就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long LL;
 5 const int maxn = 22;
 6 LL ret, dret;
 7 int n;
 8 char s[maxn];
 9
10 void dfs(int pos, int cnt, LL c, LL d, LL e) {
11     if(pos >= n) return;
12     if(cnt == 3) {
13         dret = min(dret, c * d / e);
14         return;
15     }
16     if(cnt == 0) {
17         LL tmp = 0;
18         for(int i = pos; i < n; i++) {
19             tmp *= 10; tmp = tmp + s[i] - ‘0‘;
20             dfs(i+1,cnt+1, tmp,d,e);
21         }
22     }
23     if(cnt == 1) {
24         LL tmp = 0;
25         for(int i = pos; i < n; i++) {
26             tmp *= 10; tmp = tmp + s[i] - ‘0‘;
27             dfs(i+1,cnt+1,c,tmp,e);
28         }
29
30     }
31     if(cnt == 2) {
32         LL tmp = 0;
33         for(int i = pos; i < n; i++) {
34             tmp *= 10; tmp = tmp + s[i] - ‘0‘;
35         }
36         dfs(-1,cnt+1,c,d,tmp);
37     }
38 }
39
40 int main() {
41     // freopen("in", "r", stdin);
42     int T, _ = 1;
43     scanf("%d", &T);
44     while(T--) {
45         scanf("%s", s);
46         n = strlen(s);
47         ret = -((LL)1 << 40);
48         for(int i = 1; i < n-3; i++) {
49             LL x = 0;
50             LL y = 0;
51             LL s1 = 0, s2 = 0, ss = 0;
52             int j = 0;
53             while(j < i) {
54                 x *= 10;
55                 x = x + s[j++] - ‘0‘;
56             }
57             y = s[i] - ‘0‘;
58             s1 = x + y;
59             j = 1;
60             x = s[0] - ‘0‘; y = 0;
61             while(j <= i) {
62                 y *= 10;
63                 y = y + s[j++] - ‘0‘;
64             }
65             s2 = x + y;
66             ss = max(s1, s2);
67             dret = (LL)1 << 40;
68             dfs(i+1, 0, 0, 0, 0);
69             ret = max(ret, ss-dret);
70         }
71         printf("Case #%d: ", _++);
72         printf("%I64d\n", ret);
73     }
74     return 0;
75 }
时间: 2024-12-28 01:07:55

[HDOJ5938]Four Operations(暴力,DFS)的相关文章

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <

hdu 5024 Wang Xifeng&#39;s Little Plot【暴力dfs,剪枝】

2014年广州网络赛的C题,也是水题.要你在一个地图中找出一条最长的路,这条路要保证最多只能有一个拐角,且只能为90度 我们直接用深搜,枚举每个起点,每个方向进行dfs,再加上剪枝. 但是如果直接写的话,那一定会特别麻烦,再加上方向这一属性也是我们需要考虑的方面,我们将从别的地方到当前点的方向编一个号:往右为0,如下图顺时针顺序编号 (往右下方向为1,往下为2......以此类推) 我们知道了当前点的坐标,来到当前点的方向,以及到目前有没有拐弯,这几个属性之后,就可以记忆化搜索了,用一个四维数组

Codeforces Round #359 (Div. 2) C. Robbers&#39; watch (暴力DFS)

题目链接:http://codeforces.com/problemset/problem/686/C 给你n和m,问你有多少对(a, b) 满足0<=a <n 且 0 <=b < m 且a的7进制和n-1的7进制位数相同 且b的7进制和m-1的7进制位数相同,还有a和b的7进制上的每位上的数各不相同. 看懂题目,就很简单了,先判断a和b的7进制位数是否超过7,不超过的话就dfs暴力枚举计算就可以了. 1 //#pragma comment(linker, "/STACK

hihoCoder 1185 连通性&#183;三(Tarjan缩点+暴力DFS)

#1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出去,就拜托小Hi和小Ho忙帮放牧. 约翰家一共有N个草场,每个草场有容量为W[i]的牧草,N个草场之间有M条单向的路径. 小Hi和小Ho需要将牛羊群赶到草场上,当他们吃完一个草场牧草后,继续前往其他草场.当没有可以到达的草场或是能够到达的草场都已经被吃光了之后,小hi和小Ho就把牛羊群赶回家. 一开

Strange Country II 暴力dfs

这题点的个数(<=50)有限, 所以可以纯暴力DFS去搜索 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring> #include <cmath> #include <stack> #

ZOJ Seven-Segment Display 暴力dfs + 剪枝

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3954 0 = on     1 = off A seven segment code of permutation p is a set of seven segment code derived from the standard code by rearranging the bits into the order indicated by p. For exampl

UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上的题解,大神们的代码就是不一样, 但还是看了好久才看懂.首先是用二进制法进行暴力,因为 n 最大才是15,不会超时的,然后就是在暴力时判断打开这些环时,剩下的是不是还存在环, 如果存在那么不是不行的,然后再判断是不是有的环有两个分支以上,因为一个环如果成链那么最多只有两个分支,所以多于两个的也是不对

HDU 5113 Black And White(暴力dfs+减枝)

题目大意:给你一个n×m的矩阵,然后给你k种颜色,每种颜色有x种,所有的个数加起来恰好为n×m个.问你让你对这个矩阵进行染色问你,能不能把所有的小方格都染色,而且相邻两个颜色不同. 思路:一开始想的是构造,先按照个数进行排序,枚举每一个位置,贪心的策略先放多的,如果可以全部放下就输出YES,以及存贮的方案,否则输出NO,但是有bug,一直不对... 正解:dfs暴力枚举每一个点,裸的话需要25!,显然会超时,需要先排个序用构造的策略,让多的先放这样可以减枝.然后再dfs就可以了. Black A

洛谷OJ 1433 吃奶酪 暴力dfs(最优性cut)

https://www.luogu.org/problem/show?pid=1433 题意:起点为(0,0) 有n个点 求出起点出发经过n个点的最小距离//15个点 暴力 + 最优性cut(sum+还剩的点*最小距离>=ans 则stop) 水过... #include <bits/stdc++.h> using namespace std; typedef pair<int,double> pii; const int N=2e3+20; const double inf