每天一套题打卡|河南省第九届ACM/ICPC

A 表达式求值

表达式求值:可以用递归求解,也可以用栈模拟,考过多次。

类似题目:NYOJ305,NYOJ35

用栈模拟做法:


#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
stack<int> dsta;//数据栈
stack<char> osta;//字符栈
char s[1005];
int main()
{
    int T,i,j;
    scanf("%d",&T);
    while(T--)
    {
        scanf("\n%s",&s[1]);
        int len=strlen(&s[1]);
        s[0]='('; s[++len]=')';//在给定的表达式两端添加上一对括号
        for(i=0;i<=len;i++)
        {
            if(s[i]=='(')
                osta.push(s[i]);
            else if(s[i]=='S')
            {
                osta.push('(');//压入一个左括弧
                i+=3;
            }
            else if(s[i]>='0' && s[i]<='9')
            {
                int v=0;
                while(s[i]>='0' && s[i]<='9')
                    v=v*10+(s[i++]-'0');
                i--;
                dsta.push(v);
            }
            else if(s[i]=='+')
            {
                while(osta.top()!='(' && osta.top()!=',')
                {
                    int a=dsta.top(); dsta.pop();
                    int b=dsta.top(); dsta.pop();
                    int c;
                    switch(osta.top())
                    {
                        case '+':c=b+a;break;
                        case '*':c=b*a;break;
                    }
                    dsta.push(c);
                    osta.pop();
                }
                osta.push(s[i]);
            }
            else if(s[i]=='*')
            {
                if(osta.top()=='*')
                {
                    int a=dsta.top(); dsta.pop();
                    int b=dsta.top(); dsta.pop();
                    dsta.push(b*a);
                    osta.pop();
                }
                osta.push(s[i]);
            }
            else if(s[i]==')' || s[i]==',')//遇到逗号及时求值
            { //当遇到 ','时,就把Smax的前半部分表达式的值求出来  

                //运算符号 都在这里计算 + - * / smax自定义
                while(osta.top()!='(')
                {
                    int a=dsta.top(); dsta.pop();
                    int b=dsta.top(); dsta.pop();
                    int c,suma=0,sumb=0;
                    switch(osta.top())
                    {
                        case '+':c=b+a;break;
                        case '*':c=b*a;break;
                        case ',':{
                        //逐位分割求和
                            while(b!=0)
                            {
                                sumb+=b%10; b/=10;
                            }
                            while(a!=0)
                            {
                                suma+=a%10; a/=10;
                            }
                            c=max(suma,sumb);
                            break;
                        }
                    }
                    dsta.push(c);
                    osta.pop();
                }
                osta.pop();
                if(s[i]==',')//求完值之后,把逗号压入栈内,以便后半部分Smax表达式的求值
                    osta.push(s[i]);
            }
        }
        printf("%d\n",dsta.top());
        dsta.pop();
    }
    return 0;
}

B 宣传墙

状压dp 推状态转移
或者用矩阵快速幂优化

网上代码看不懂。。。

C 信道安全

单源点的最短路修改版,用dijkstra做,初始化dist数组和松弛改一下就可以了。

D 导弹发射

LIS的二分写法,数据量1e5 O(N^2)的会超时。
另外题目中说的 导弹一直在前进,不能以原来的X/Y轴作为坐标轴了,需要坐标变换以两条射线为坐标轴

E 机器设备

我用bfs搜索做的,从原点(0,0)开始搜,每次将与当前点相切的圆心齿轮加入到队列,这里的相切意思是:两个圆心距离等于两个圆半径和

F Decimal integer conversion

题意:给一个十进制数 的二进制数 和一个 三进制数,其中各有一位是错的,求正确的十进制数
枚举一下就可以了,二进制和三进制 转成10进制后出现相同的数就是答案

G Prototypes analyze

一个二叉搜索树,问形状有多少个。
明天看题解,学会建树吧......

原文地址:https://www.cnblogs.com/fisherss/p/10798600.html

时间: 2024-08-30 08:22:56

每天一套题打卡|河南省第九届ACM/ICPC的相关文章

每天一套题打卡|河南省第七届ACM/ICPC

A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][j] && g[k][j] < g[i][j]时,g[i][j] = max(g[i][k],g[k][j]); #include<bits/stdc++.h> using namespace std; const int maxn = 510; int n,m; int q

2016河南省第九届ACM程序设计竞赛【正式赛真题】

A题:表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y值的各位数字之和,再从中选最大数.4.如果 X 是 表达式,则 (X)也是表达式.例如:表达式 12*(2+3)+Smax(333,220+280) 的值为 6

codeforces水题100道 第十八题 Codeforces Round #289 (Div. 2, ACM ICPC Rules) A. Maximum in Table (brute force)

题目链接:http://www.codeforces.com/problemset/problem/509/A题意:f[i][1]=f[1][i]=1,f[i][j]=f[i-1][j]+f[i][j-1],求f[n][n].C++代码: #include <iostream> using namespace std; int n, f[11][11]; int main() { cin >> n; for (int i=1;i<=n;i++) f[i][1] = f[1][

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

应试教育:你是在“套题”还是在“解决问题”?

?为什么当初会采用"背题型"的方式? ?"背题型"的局限性在哪? ?建构"知识体系"优势在哪? ?"题海战术"的认知错误 ?学习和考试的本质 声明:此文纯属个人学习方法总结. 1.为什么当初会采用"背题型"的方式? 以前上了高中,由于身边学霸太多,为了急于缩短与他们之间的天壤之别,总想着调整自己的学习方法. 本来自己就没什么学习方法,加上老师布置下做不完的题目,况且时常听到"题海战术"的

套题T6

过节(festival.cpp/c/pas) Dxy帮老师们过教师节的时候需要购买礼物.货架上有n 种礼物,每种礼物有不同的个数.每种礼物有价值和花费两种属性,帮他算出最大可以得到的价值.M是带的钱数有多少 Input: 第一行两个数n,m 第2到n+1行:每行三个数a,b,c,表示一种礼物的个数,花费和价值.   Output: 最大可得价值.   样例输入: 1  1 1  1  1   样例输出: 1 a*b(mod.cpp/c/pas) 没错dxy的题目就是这么简单. 输入: 第一行一个

套题T4

Problem 1 无聊的gcd(gcd.c/cpp/pas) 话说出题人不会被查水表吧. 简单的问题描述:从N个正整数里面取出K个数的最大公因数最大是多少.(请将答案乘上k之后输出哦,谢谢合作.) 输入格式 第一行两个正整数N,K. 第二行n个正整数 输出格式 输出一个正整数表示最大的最大公因数. 样例输入 3 1 1 2 3 样例输出 3 数据说明 对于30%的数据,保证k≤n≤20. 对于50%的数据,保证输入中所有数小于5000. 对于100%的数据,保证输入中所有数小于500000,k

[暑假集训]区域赛套题集

2014-07-03 [浙江第11届省赛]ZOJ 3785 What day is that day?  (打表找循环节) [暑假集训]区域赛套题集

Educational Codeforces Round 15 套题

这套题最后一题不会,然后先放一下,最后一题应该是大数据结构题 A:求连续最长严格递增的的串,O(n)简单dp #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <vector> usi