1. 程式人生 > >2018 科大訊飛筆試編程題

2018 科大訊飛筆試編程題

getch emp span size 一輪 結果 題意 urn 比賽

第一題:爭吵問題

有一個隊列,每個人要麽朝左邊(L表示),要麽朝右邊(R表示),因為每個人都討厭其他任何人,只要兩人面對面就會發生真吵。真吵結果是勝者留在隊列中,敗的人移除隊中。

如果序列中有多對爭吵,可以任選一對,勝者留在隊中,敗者出局,求最後隊列最少人數是多少。

例子:

LRLRLRR

輸出:3

LRR。

思路:這道題找到方法了就很簡單,依據題意 如果要真吵就只有 RL (兩人對面)這種情況 ,其他 LL RR LR 都不會發生真吵。

所以我們只要從左邊向右找到第一個R,從右邊向左找到第一個L。那麽這兩人以及之間的人最終只有一個人留下。

程序代碼如下:

#include<iostream>
#include
<string> int main(){ string str; while(cin>>str){ int n=str.size(); int m=-1,k=-1; for(int i=0;i<n;i++) if(str[i]==R){ m=i; break; } for(int i=n-1;i>=0;i--) if(str[i]==
L){ k=i; break; } if(m==-1||k==-1||k<m) cout<<n<<endl; else cout<<n-(k-m)<<endl; } return 0; }

第二題:球隊問題

有n對球隊進入總決賽,現在要進行淘汰賽,每每兩隊都進行一場比賽,最終前n/2隊進入下一輪淘汰賽。

排名規則:

球隊勝一場得3分,平一場得1分,輸一次得0分。

積分越高排名越前,積分相同,看凈勝球數,越多越靠前,凈勝球數相同,看進球數,進球越多越靠前(例子最終都會排出名次)。

求進入淘汰賽的球隊。

例子:

4
A
B
C
D
A-B 3:1
A-C 2:1
A-D 0:3
B-C 5:6
B-D 1:2
C-D 1:1

輸出:

D
C

程序代碼如下:

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include <iomanip>
using namespace std;
class score{
public:
    int cnt;       //球隊編號
    int jifen;     //積分
    int jinshen;   //凈勝球
    int jinqiu;    //進球數
    int fuqiu;    // 輸球數
    score(){jifen=0;jinshen=0;jinqiu=0;fuqiu=0;cnt=0;}
    //void getjinshen(){jinshen=jinqiu-fuqiu;}
};

int main(){
    int n;
    while(cin>>n){
        vector<score> jj(n);
        map<string,int> a;
        map<int,string> b;
        string str;
        int cnt=0;
        for(int i=0;i<n;i++){
            cin>>str;
            a.insert(make_pair(str,cnt));    //str  對應  cnt
            b.insert(make_pair(cnt++,str));  //cnt  對應  str
        }

        for(int i=0;i<n;i++)
            jj[i].cnt=i;
            
        getchar();

        for(int i=0;i<n*(n-1)/2;i++){
            getline(cin,str);
            int k,k2,k3,m,f;
            k=str.find(-);  
            string s1,s2,s3,s4;
            s1=str.substr(0,k);      //球隊1名稱
            k2=str.find( );
            s2=str.substr(k+1,k2-k-1);   //球隊2名稱   
            k3=str.find(:);
            s3=str.substr(k2+1,k3-k2-1);  //球隊1進球數
            s4=str.substr(k3+1);     //球隊2進球數
            m=a[s1];  //球隊1對應的編號
            f=a[s2];  //球隊2對應的編號
            int i3=0,i4=0;
            for(int i=0; i<s3.size();i++)
            {
                i3=i3*10+s3[i]-0;
            }
            for(int i=0; i<s4.size();i++)
            {
                i4=i4*10+s4[i]-0;
            }

            jj[m].jinqiu+=i3;  //進球數
            jj[f].jinqiu+=i4;
            jj[m].fuqiu+=i4;  //輸球數
            jj[f].fuqiu+=i3;

            if(i3==i4){
                jj[m].jifen+=1;
                jj[f].jifen+=1;
            }
            if(i3<i4){
                jj[f].jifen+=3;
            }else jj[m].jifen+=3;
        }
        for(int i=0;i<n;i++){
            jj[i].jinshen=jj[i].jinqiu-jj[i].fuqiu;
        }
        cout<<"==============================================================================="<<endl;
        cout<<setw(16)<<"球隊名"<<setw(8)<<"積分"<<setw(10)<<"凈勝球"<<setw(10)<<"進球數"<<endl;
        for (int i=0;i<n;i++){
            cout<<setw(16)<<b.at(i)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl;
        }
        cout<<"==============================================================================="<<endl;
        for(int i=0;i<n-1;i++){
            int u=i;
            for(int j=i+1;j<n;j++){
                if(jj[j].jifen>jj[u].jifen)
                    u=j;
                else if(jj[j].jifen==jj[u].jifen){
                    if(jj[j].jinshen>jj[u].jinshen)
                        u=j;
                    else
                        if(jj[j].jinqiu>jj[u].jinqiu)
                            u=j;
                }
            }
            score temp;
            temp=jj[i];
            jj[i]=jj[u];
            jj[u]=temp;
        }
        cout<<"排名後"<<endl;
        cout<<"==============================================================================="<<endl;
        cout<<setw(16)<<"球隊名"<<setw(8)<<"積分"<<setw(10)<<"凈勝球"<<setw(10)<<"進球數"<<endl;
        for (int i=0;i<n;i++){
            cout<<setw(16)<<b.at(jj[i].cnt)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl;
        }
        cout<<"==============================================================================="<<endl;

        cout<<""<<n/2<<"名球隊"<<endl;
        for(int i=0;i<n/2;i++){
            str=b.at(jj[i].cnt); 
            cout<<str<<endl;
        }

    }
    return 0;
}

2018 科大訊飛筆試編程題