北理工2016年推免上机考试

1.乒乓球比赛分为11分制和21分制,下面输入比赛的获胜情况,分别输出11分制和21分制的比赛结果。

其中输入数据中W代表甲得分,L代表乙得分,E代表输入结束,可以多行输入,并忽略E以后的内容。

输入:WWWWWWWWWWWWWWWWWWWWWWWWWLE
输出:
11分制   第1局:11:0   第2局:11:0   第3局:3:1
21分制   第1局:21:0   第2局:4:1

注意:只要有一方拿到到11分(21分)就算1局。

#include<iostream>
#include<queue>
using namespace std;
int c1=0,c2=0;//初始化甲乙得分
int cnt = 1;//局数
    
void print()
{
    cout<<""<<cnt++<<"局:"<<c1<<":"<<c2;
    c1=0;c2=0;//比分清零 
}

int main()
{
    char c;
    queue<char> q1;//11分制
    queue<char> q2;//21分制
    while (cin >> c && c != 'E')//先全部读进来 
    {
        q1.push(c);q2.push(c);
    }
    
    cout<<"11分制"; 
    while(!q1.empty())//先处理11分制情况 
    {
        c = q1.front();
        q1.pop();
        if(c=='W')
        {
            c1++;
            if(c1==11)print();
        }
        else if(c=='L')
        {
            c2++;
            if(c2==11)print();
        }
    } 
    if(c1!=11&&c2!=11)print();//终局结果显示 
    cout<<endl;//换行 
    cnt = 1;//局数初始化 
    cout<<"21分制"; 
    while(!q2.empty())//先处理11分制情况 
    {
        c = q2.front();
        q2.pop();
        if(c=='W')
        {
            c1++;
            if(c1==21)print();
        }
        else if(c=='L')
        {
            c2++;
            if(c2==21)print();
        }
    } 
    if(c1!=21&&c2!=21)print();//终局结果显示 
    cout<<endl;//换行 
    return 0;
}

2.在公司中,存在着领导-员工关系,一个领导可以有多个员工,一个员工只能有一个领导。用 {员工, 领导}, {员工, 领导}, {员工, 领导}, {员工, 领导}..... 这样的格式录入数据,输出公司的管理关系。其中 员工,领导用编号表示。

输入:{21, 13}, {32, 13}, {24, 14}, {28, 14}, {13, 11}, {14, 11}

输出:{11, [{13, [{21}, {32}]}, {14, [{24}, {28}]}]}

其中xx, [{aa},{bb}]表示,xx的员工有aa,bb   ,{},{}...之间是同级员工关系,要按照编号从小到大排列。

解题思路:vector二维动态数组存储信息,一级下标为领导,二级下标存储多个员工信息。用并查集搜索树根后深搜遍历。atoi函数很好用,是cstdlib库里的。另外注意vector的迭代器不要定义为全局变量,否则则在递归中会传递全局值,递归中的迭代器存活期应为本迭代周期内,所以应该直接定义在for语句中。(注意:本题应该不会出现多个分立树的情况,所以我只写了一棵树的情况)

#include<iostream>
#include<string>
#include<cstdlib>
#include<vector>
#include<queue>
#include<algorithm> 
using namespace std;
vector<vector<int> >v(1000);
int p[10000];

void init()
{
    for(int i=0;i<10000;i++)p[i]=i;
}

int find(int x)
{
    return (x==p[x])?x:find(p[x]);
}

void dfs(int x)//先打印自身,然后从小到大递归 
{
    cout<<"{"<<x;
    if(v[x].empty())
    {
        cout<<"}";return;
    }
    else
    {
        cout<<",[";
        sort(v[x].begin(),v[x].end());//从小到大排序 
        for(vector<int>::iterator vi=v[x].begin();vi!=v[x].end();vi++)//深搜递归 
        {
            if(vi!=v[x].begin())cout<<",";
            dfs(*vi);
        }
        cout<<"]}";
        return;
    }
}

int main()
{
    string s;
    cin>>s;
    queue<int>q;
    for(int i=0;i<s.size();i++)
    {
        char t[5];
        int cnt = 0;
        while(s[i]>='0'&&s[i]<='9')t[cnt++]=s[i++];
        if(cnt!=0)
        {
            int x = atoi(t);
            q.push(x);
        }
    }
    init();
    int a,b;
    while(!q.empty())
    {
        a = q.front();//员工 
        q.pop();
        b = q.front();//领导 
        q.pop();
        v[b].push_back(a);
        p[a]=b;
    }
    int rt = find(a);//找到树根
    dfs(rt); 
    return 0;
}

 

posted @ 2019-09-01 10:21  郭怡柔  阅读(308)  评论(0)    收藏  举报