1. 程式人生 > >每天一套題打卡|河南省第九屆ACM/ICPC

每天一套題打卡|河南省第九屆ACM/ICPC

\n turn 最短路 打卡 最短 等於 dijkstra -c 快速冪

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

一個二叉搜索樹,問形狀有多少個。
明天看題解,學會建樹吧......

每天一套題打卡|河南省第九屆ACM/ICPC