1. 程式人生 > 實用技巧 >11.28天梯賽補題報告

11.28天梯賽補題報告

L1-6吃火鍋(15分)

以上圖片來自微信朋友圈:這種天氣你有什麼破事打電話給我基本沒用。但是如果你說“吃火鍋”,那就厲害了,我們的故事就開始了。

本題要求你實現一個程式,自動檢查你朋友給你發來的資訊裡有沒有chi1 huo3 guo1

輸入格式:

輸入每行給出一句不超過 80 個字元的、以回車結尾的朋友資訊,資訊為非空字串,僅包括字母、數字、空格、可見的半形標點符號。當讀到某一行只有一個英文句點.時,輸入結束,此行不算在朋友資訊裡。

輸出格式:

首先在一行中輸出朋友資訊的總條數。然後對朋友的每一行資訊,檢查其中是否包含chi1 huo3 guo1,並且統計這樣厲害的資訊有多少條。在第二行中首先輸出第一次出現chi1 huo3 guo1

的資訊是第幾條(從 1 開始計數),然後輸出這類資訊的總條數,其間以一個空格分隔。題目保證輸出的所有數字不超過 100。

如果朋友從頭到尾都沒提chi1 huo3 guo1這個關鍵詞,則在第二行輸出一個表情-_-#

輸入樣例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

輸出樣例 1:

5
3 2

輸入樣例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

輸出樣例 2:

5
-_-#

解題思路:一開始不知道string類查詢函式的這個用法,傻傻的用字串陣列記錄字元然後挨個遍歷比較,它就執行超時了。。。。學到了學到了~
ac程式碼:
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
int main(){
    string s;
    int k=0,n=0,flag=0,first;
    while(getline(cin,s)){
        
if(s=="."){ break; } n++; if(s.find("chi1 huo3 guo1")!=string::npos){ k++; if(flag==0){ flag=1; first=n; } } } cout<<n<<endl; if(k){ cout<<first<<" "<<k<<endl; } else{ cout<<"-_-#"<<endl; } return 0; }
View Code

L2-1簡單計算器(25分)

本題要求你為初學資料結構的小夥伴設計一款簡單的利用堆疊執行的計算器。如上圖所示,計算器由兩個堆疊組成,一個堆疊S1​​存放數字,另一個堆疊S2​​存放運算子。計算器的最下方有一個等號鍵,每次按下這個鍵,計算器就執行以下操作:

  1. S1​​中彈出兩個數字,順序為n1​​和n2​​;
  2. S2​​中彈出一個運算子 op;
  3. 執行計算n2​​opn1​​;
  4. 將得到的結果壓回S1​​。

直到兩個堆疊都為空時,計算結束,最後的結果將顯示在螢幕上。

輸入格式:

輸入首先在第一行給出正整數N(1),為S1​​中數字的個數。

第二行給出N個絕對值不超過 100 的整數;第三行給出N1個運算子 —— 這裡僅考慮+-*/這四種運算。一行中的數字和符號都以空格分隔。

輸出格式:

將輸入的數字和運算子按給定順序分別壓入堆疊S1​​和S2​​,將執行計算的最後結果輸出。注意所有的計算都只取結果的整數部分。題目保證計算的中間和最後結果的絕對值都不超過1。

如果執行除法時出現分母為零的非法操作,則在一行中輸出:ERROR: X/0,其中X是當時的分子。然後結束程式。

輸入樣例 1:

5
40 5 8 3 2
/ * - +

輸出樣例 1:

2

輸入樣例 2:

5
2 5 8 4 4
* / - +

輸出樣例 2:

ERROR: 5/0

解題思路:分別用陣列去存,然後錯位進行加減乘除運算即可,要注意是倒序運算。
ac程式碼:
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
int main(){
    int n,i,a[1005],sum;
    char s[1005];
    cin>>n;
    for(i=0;i<n;i++){
        cin>>a[i];
    }
    for(i=0;i<n-1;i++){
        cin>>s[i];
    }
    int flag=0;
    if(s[n-2]=='+'){
        sum=a[n-1]+a[n-2];
    }
    else if(s[n-2]=='-'){
        sum=a[n-2]-a[n-1];
    }
    else if(s[n-2]=='*'){
        sum=a[n-1]*a[n-2];
    }
    else if(s[n-2]=='/'){
        if(a[n-1]==0){
            cout<<"ERROR: "<<a[n-2]<<"/0"<<endl;
            flag=1;
        }
        else{
            sum=a[n-2]/a[n-1];
        }    
    }
    if(flag==0){
        for(i=n-3;i>=0;i--){
            if(s[i]=='+'){
                sum=a[i]+sum;
            }
            else if(s[i]=='-'){
                sum=a[i]-sum;
            }
            else if(s[i]=='*'){
                sum=a[i]*sum;
            }
            else if(s[i]=='/'){
                if(sum==0){
                    cout<<"ERROR: "<<a[i]<<"/0"<<endl;
                    flag=1;
                    break;
                }
                else{
                    sum=a[i]/sum;
                }    
            }
            if(flag==1){
                break;
            }
        }
    }
    if(flag==0){
        cout<<sum<<endl;
    }
    return 0;
}
View Code