NOIP 2005 等價表示式

2021-07-23 22:19:01 字數 2680 閱讀 6341

題目描述

明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。

這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算機來解決這個問題。假設你是明明,能完成這個任務嗎?

這個選擇題中的每個表示式都滿足下面的性質:

1. 表示式只可能包含乙個變數『a』。

2. 表示式中出現的數都是正整數,而且都小於10000。

3. 表示式中可以包括四種運算『+』(加),『-』(減),『』(乘),『^』(乘冪),以及小括號『(』,『)』。小括號的優先順序最高,其次是『^』,然後是『』,最後是『+』和『-』。『+』和『-』的優先順序是相同的。相同優先順序的運算從左到右進行。(注意:運算子『+』,『-』,『*』,『^』以及小括號『(』,『)』都是英文本元)

4. 冪指數只可能是1到10之間的正整數(包括1和10)。

5. 表示式內部,頭部或者尾部都可能有一些多餘的空格。

下面是一些合理的表示式的例子:

((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……

輸入輸出格式

輸入格式:

輸入檔案equal.in的第一行給出的是題幹中的表示式。第二行是乙個整數n(2 <= n <= 26),表示選項的個數。後面n行,每行包括乙個選項中的表示式。這n個選項的標號分別是a,b,c,d……

輸入中的表示式的長度都不超過50個字元,而且保證選項中總有表示式和題幹中的表示式是等價的。

輸出格式:

輸出檔案equal.out包括一行,這一行包括一系列選項的標號,表示哪些選項是和題幹中的表示式等價的。選項的標號按照字母順序排列,而且之間沒有空格。

輸入輸出樣例

輸入樣例#1:

( a + 1) ^2

3 (a-1)^2+4*a

a + 1+ a

a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a

輸出樣例#1:

ac說明

對於30%的資料,表示式中只可能出現兩種運算子『+』和『-』;

對於其它的資料,四種運算子『+』,『-』,『*』,『^』在表示式中都可能出現。

對於全部的資料,表示式中都可能出現小括號『(』和『)』。

2023年提高組第四題

【分析】

去模擬吧…無力吐槽

tyvj資料有點不靠譜啊…

【**】

//noip 等價表示式 

#include

#include

#include

#include

#include

#include

#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

const ll mod=1e6+7;

ll pri[1000]; //優先順序,優先順序越高越先進行運算

stack

num,ope;

string

map[50];

ll n,ans[12];

inline ll ksm(ll x,ll y) //快速冪取模

int main()

scanf("%lld",&n);

fo(i,1,n)

} //由於洛谷不支援getline,只能用快速讀入的詭異方法...

fo(j,0,n)

else

if(str[i]==')') //彈彈彈

if(ope.empty()) break;

ope.pop();

}else

if(ope.empty()) ope.push(str[i]);

else

if(str[i]=='(') ope.push(str[i]);

else

while(1)

ope.push(str[i]);}}

while(!ope.empty())

if(ope.empty() || num.size()==1) break;

ll shu1=num.top();num.pop();ll shu2=num.top();num.pop();

ch=ope.top();ope.pop();

if(ch=='*') num.push((shu2*shu1)%mod);

if(ch=='+') num.push((shu2+shu1)%mod);

if(ch=='-') num.push((shu2-shu1)%mod);

if(ch=='^') num.push(ksm(shu2,shu1));

}int tt=num.top();while(tt<0) tt+=mod;

if(j && ans[k]!=tt) break;

if(j==0)

}if(j && k==11) printf("%c",j+'a'-1);

}printf("\n");

return

0;}

NOIP2005 等價表示式

等價表示式 equal.pas c cpp 問題描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為...

NOIP2005 等價表示式

明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算...

NOIP 2005 等價表示式 題解

昨天覆習了一下表示式 棧 和圖論相關的演算法,結果卡在一道題上,上午做的等價表示式,下午才有所進展,最後好不容易寫出來了個像樣的程式,但又因為落谷和codevs上資料有誤 左右括號不匹配導致r re,例如 a 2 2 折騰半天,最後到vijos上也只是分多了點,也沒a掉。兩個棧是肯定的,乙個用來儲存...