2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

/**
题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单)
链接:https://nanti.jisuanke.com/t/15504
题意:给一个合法的表达式,包含加号+、减号-、括号()、数字常量,表达式中没有空格。
输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位。

思路:暴力模拟;python有函数可以直接调用。

坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数,
否则输出整数,不出现小数。

*/

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int maxn=1e6+5;
const double eps = 1e-12;
char op[1005];
double a[1004];
char s[1004];
int n;
int flag;
int main()
{
    while(scanf("%d",&n)==1)
    {
        scanf("%s",s);
        flag = 0;
        int az = 0, pz = 0;
        int len = strlen(s);
        for(int i = 0; i < len; ){
            LL in = 0;
            LL dt = 0;
            LL p = 1;
            if(s[i]>=‘0‘&&s[i]<=‘9‘){
                while(i<len&&s[i]>=‘0‘&&s[i]<=‘9‘){
                    in = in*10+(s[i]-‘0‘);
                    i++;
                }
                if(s[i]==‘.‘){
                    flag = 1;
                    i++;
                    while(i<len&&s[i]>=‘0‘&&s[i]<=‘9‘){
                        dt = dt*10+(s[i]-‘0‘);
                        i++;
                        p *= 10;
                    }
                }
                double x = in+1.0*dt/p;
                a[az++] = x;
            }else
            {
                if(s[i]==‘-‘){
                    op[pz++] = ‘-‘;
                    i++;
                    continue;
                }
                if(s[i]==‘+‘){
                    i++;
                    op[pz++] = ‘+‘;
                    continue;
                }
                if(s[i]==‘(‘){
                    i++;
                    op[pz++] = ‘(‘;
                    continue;
                }
                if(s[i]==‘)‘){///左结合。找到左边的符号,以及左边的数,然后模拟计算过去。
                    int pl = pz-1;
                    while(op[pl]!=‘(‘) pl--;
                    int temp = pl;// pz = tmep;

                    int cnt = pz-pl-1;
                    int tempa = az-cnt-1;
                    double value = a[az-cnt-1];
                    for(int j = pl+1, k = az-cnt; j < pz; j++,k++){
                        if(op[j]==‘+‘){
                            value += a[k];
                        }else value -= a[k];
                    }

                    pz = temp;
                    az = tempa;
                    a[az++] = value;
                    i++;
                    continue;
                }
            }
        }

        double value = a[0];///已处理所有括号,只有数和-,+符号。左结合计算。
        for(int j = 0, k = 1; j < pz; j++,k++){
            if(op[j]==‘+‘){
                value += a[k];
            }else value -= a[k];
        }
        if(flag)///如果出现过浮点数。
            printf("%.6lf\n",value);
        else
            printf("%lld\n",(LL)value);
    }
    return 0;
}
时间: 2024-12-19 08:05:14

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)的相关文章

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务 1 /* QYP kuai wo dai ma*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<iomanip> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cstdio> 8 #include<queue> 9 #include<ctime

2017 计蒜之道 初赛 第一场 A、B题

A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: 如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三.现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的.请你帮小红计算他成三的线段数. 样例对应的棋盘如下: 输入格式 输入第一行两个整数 n,m(3 \le n, m \le

计蒜之道 初赛 第二场 题解

人人都有极客精神 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: <img src="http://res.jisuanke.com/img/nanti/428.png" <=&

2018 计蒜之道 初赛 第二场

签到完看到C没什么人过就溜乐. A.淘宝的推荐系统 直接DP,时间复杂度$O(∑nd)$ #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se s

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

2017 计蒜之道 初赛 第五场 D. UCloud 的安全秘钥(困难)

小数据打表,大数据暴力. 导致超时的主要原因是$m$小的询问次数太多,可以把$m≤10$的答案直接暴力打表存起来,$m>10$的用$C$题的方法即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #in

2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)

暴力. 暴力枚举$S$串的每一个长度为$m$的子串,排序判断即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #inc

2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)

暴力. $O(m*n)$的算法可以通过此题,每次询问$O(m)$扫S数组,统计不同数字的个数,每次移动最多只会变化两个数字,如果不同数字个数为$0$,那么答案加$1$. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue&g

2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建

贪心. 从大到小排序之后进行模拟,注意$n=1$和$n=0$的情况. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #in