两个班的小朋友混在一起,找出同班的小朋友。

        /*
        幼儿园两个班的小朋友排队时混在了一起
        每个小朋友都知道自己跟前面一个小朋友是不是同班
        请你帮忙把同班的小朋友找出来
        小朋友的编号为整数
        与前面一个小朋友同班用Y表示
        不同班用N表示
        输入描述:
        输入为空格分开的小朋友编号和是否同班标志
        比如 16/N 12/Y 13/N 14/Y
        表示一共有4位小朋友
        12和16是同班 13和12不同班 14和13同班
        小朋友总数不超过999
         0< 每个小朋友编号 <999
         不考虑输入格式错误

         输出两行
         每一行记录一班小朋友的编号  编号用空格分开
         并且
         1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
         2. 如果只有一个班的小朋友 第二行为空
         3. 如果输入不符合要求输出字符串ERROR

         示例:
         输入
         16/N 12/Y 13/N 14/Y
         输出(按编号大小排列)
         12 16
         13 14
         说明:12的同班标记为Y因此和16同班
              13的同班标记位N因此和16,12不同班
              14的同班标记位Y因此和13同班
         */
#include <regex>
#include <vector>
#include <iostream>
#include <string>
#include <set>
#include <sstream>
using namespace std;

struct ST 
{
	string id;
	bool clss;   //只有两个班级 不是1就是0
};
vector<pair<string, string>> v;
vector<ST> vs; 
multiset<int> s1, s0;   //1班的成员编号,0班的成员编号,set自动排序

int main()
{
	string str;
	regex reg("(\\d+)/([NY]{1})"); 
	while (cin >> str)
	{
		smatch result; 
		if (regex_match(str, result, reg))
		{
			v.push_back(make_pair(result[1], result[2]));
			//result[i]是正则表达式中第i个括号中匹配到的内容
		}
		else
		{
			cout << "ERROR!";
			return 0;
		}
	}
	//默认第一个小孩是1班的 ,  后面输出的时候也要先输出1班的
	ST st;
	st.id = v[0].first;
	st.clss = 1; 
	vs.push_back(st);

	for (int i = 1; i < v.size(); i++)
	{
		st.id = v[i].first;

		if (v[i].second == "Y")  //和前面的成员是同班的  
			st.clss = vs[i - 1].clss;  //等于前面成员的班级
		else    //不同班,前一个成员班级取反 。只有两个班级 非0即1
			st.clss = !vs[i - 1].clss;   //bool值取反 加'!'

		vs.push_back(st);
	}

	stringstream ss;  int tmp;
	for (int i = 0; i < vs.size(); i++)  //1班的人员编号入s1
		//cout << vs[i].bianhao << ':' << vs[i].banji << endl;
	{
		ss.clear(); 
		ss << vs[i].id;
		ss >> tmp;    //string型转成int 入set排序

		if (vs[i].clss == 1)	
			s1.insert(tmp);
		
		if (vs[i].clss == 0)
			s0.insert(tmp);
	}

	auto itr1 = s1.begin(), itr0 = s0.begin();
	while (itr1 != s1.end()) //先输出1班的成员id
	{
		cout << *itr1 << ' ';
		++itr1;
	}
	cout << endl;
	while (itr0 != s0.end())  //再输出0班的成员id
	{
		cout << *itr0 << ' ';
		++itr0;
	}
	return 0;
}

全部评论

相关推荐

渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务