每天一套題打卡|河南省第九屆ACM/ICPC
阿新 • • 發佈:2019-05-01
\n turn 最短路 打卡 最短 等於 dijkstra -c 快速冪
枚舉一下就可以了,二進制和三進制 轉成10進制後出現相同的數就是答案
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
題意:給一個十進制數 的二進制數 和一個 三進制數,其中各有一位是錯的,求正確的十進制數
G Prototypes analyze
一個二叉搜索樹,問形狀有多少個。
明天看題解,學會建樹吧......
每天一套題打卡|河南省第九屆ACM/ICPC