北理工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; }

浙公网安备 33010602011771号