華爲2016實習機試題

      在牛客網上做的。

老師想知道從某某同學當中,分數最高的是多少,現在請你編程模擬老師的詢問。當然,老師有時候需要更新某位同學的成績. 

輸入描述:
輸入包括多組測試數據。
每組輸入第一行是兩個正整數N和M(0 < N <= 30000,0 < M < 5000),分別代表學生的數目和操作的數目。
學生ID編號從1編到N。
第二行包含N個整數,代表這N個學生的初始成績,其中第i個數代表ID爲i的學生的成績
接下來又M行,每一行有一個字符C(只取‘Q’或‘U’),和兩個正整數A,B,當C爲'Q'的時候, 表示這是一條詢問操作,他詢問ID從A到B(包括A,B)的學生當中,成績最高的是多少
當C爲‘U’的時候,表示這是一條更新操作,要求把ID爲A的學生的成績更改爲B。


輸出描述:
對於每一次詢問操作,在一行裏面輸出最高成績.

輸入例子:
5 7
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 4 5
U 2 9
Q 1 5

輸出例子:
5
6
5
9
    這道題有兩個陷阱,一是可以循環輸入,二是測試用例中出現了A>B的情況,開始沒注意,後來自己調試才發現。。上機沒有調試怎麼辦啊。。

   

#include <iostream>
using namespace std;
 
int main()
{
    int n,m,i,j,num1,num2,tempscore,maxscore,start,end;
    char ch;
    while(cin>>n>>m)
    {
        int score[n+1];
        score[0]=0;
        for(i=1;i<=n;i++)
        {
            cin>>tempscore;
            score[i]=tempscore;
        }
        for(i=0;i<m;i++)
        {
            cin>>ch>>num1>>num2;
            if(ch=='Q')
            { 
                start=min(num1,num2);
                end=max(num1,num2);
                maxscore=score[start];
                for(j=start+1;j<=end;j++)
                {
                    if(score[j]>maxscore)
                        maxscore=score[j];
                }
                cout<<maxscore<<endl;
            }
            else if(ch=='U')
            {
                score[num1]=num2;
            }
             
        }
    }

     撲克牌遊戲大家應該都比較熟悉了,一副牌由54張組成,含3~A,2各4張,小王1張,大王1張。牌面從小到大用如下字符和字符串表示(其中,小寫joker表示小王,大寫JOKER表示大王):) 
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 
輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如:4 4 4 4-joker JOKER
請比較兩手牌大小,輸出較大的牌,如果不存在比較關係則輸出ERROR

基本規則:
(1)輸入每手牌可能是個子,對子,順子(連續5張),三個,炸彈(四個)和對王中的一種,不存在其他情況,由輸入保證兩手牌都是合法的,順子已經從小到大排列;
(2)除了炸彈和對王可以和所有牌比較之外,其他類型的牌只能跟相同類型的存在比較關係(如,對子跟對子比較,三個跟三個比較),不考慮拆牌情況(如:將對子拆分成個子)
(3)大小規則跟大家平時瞭解的常見規則相同,個子,對子,三個比較牌面大小;順子比較最小牌大小;炸彈大於前面所有的牌,炸彈之間比較牌面大小;對王是最大的牌;
(4)輸入的兩手牌不會出現相等的情況。

答案提示:
(1)除了炸彈和對王之外,其他必須同類型比較。
(2)輸入已經保證合法性,不用檢查輸入是否是合法的牌。
(3)輸入的順子已經經過從小到大排序,因此不用再排序了.

輸入描述:輸入兩手牌,兩手牌之間用“-”連接,每手牌的每張牌以空格分隔,“-”兩邊沒有空格,如4 4 4 4-joker JOKER。
輸出描述:輸出兩手牌中較大的那手,不含連接符,撲克牌順序不變,仍以空格隔開;如果不存在比較關係則輸出ERROR。
代碼如下:
 
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    string a="345678910JQKA2";
    vector<string> vect;
    vect.push_back("joker JOKER");
    vect.push_back("JOKER joker");
    string line;
    string str1,str2;
    int pos;
    while(getline(cin,line))
    {
        pos=line.find('-');
        str1=line.substr(0,pos);
        str2=line.substr(pos+1);
        int n1=count(str1.begin(),str1.end(),' ');
        int n2=count(str2.begin(),str2.end(),' ');
        if(str1==vect[0]||str1==vect[1])
            cout<<str1<<endl;
        else if(str2==vect[0]||str2==vect[1])
            cout<<str2<<endl;
        
        else if(n1==n2)
        {
            int l=a.find(str1[0]);
            int r=a.find(str2[0]);
            string ans=l>r?str1:str2;
            cout<<ans<<endl;
        }
        else if(n1==3&&n2!=3)
            cout<<str1<<endl;
        else if(n1!=3&&n2==3)
            cout<<str2<<endl;
        else 
            cout<<"ERROR"<<endl;
        
    }
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章