//这题由于用了set中的erase总是出现段错误,所以不得不要转换过来,用了比较繁琐的转换!代码亦加长了不少!囧!
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <vector>
using namespace std;
set<string>::iterator it;
struct Info
{
string project;
set<string> s;
vector<string> v;
int c;
};
bool mycmp(Info a, Info b)
{
if (a.c == b.c) {
if (a.c == 0 && ((a.project.size() && b.project.size() == 0)||(a.project.size()==0 && b.project.size())))
return a.project > b.project;
else
return a.project < b.project;
}
else
return a.c > b.c;
}
int main()
{
int i = 0, j, k, m, n;
string str;
bool flag = false;
Info info[110];
while (getline(cin, str)){
//如果是输入0就结束程序
if (str == "0") break;
//如果是输入1就输出上一次的结果
else if (str == "1"){
//由于没有把握到set函数erase的正确使用方法,不得不先将set中的名字保存在vector中,然后再作处理
for (j = 1; j <= i; j++){
for (it = info[j].s.begin(); it != info[j].s.end(); it++){
info[j].v.push_back((*it));
}
}
//这里将选每一种project中的名字进行比较,看是否有重复的名字,如果有这个名字就作标记,视为无用的名字!
for (j = 1; j <= i; j++){
flag = false;
for (m = 0; m < info[j].v.size(); m++){
for (k = j+1; k <= i; k++){
for (n = 0; n < info[k].v.size(); n++){
if (info[j].v[m] == info[k].v[n]){
info[k].v[n] = "-1";
flag = true;
}
}
}
if (flag){
info[j].v[m] = "-1";
flag = false;
}
}
}
//统计每一个project的报名人数
for (j = 1; j <= i; j++){
for (m = 0; m < info[j].v.size(); m++){
if (info[j].v[m] != "-1")
info[j].c++;
}
}
sort(info, info+i+1, mycmp);
for (j = 0; j < i; j++)
cout << info[j].project << " " << info[j].c << endl;
//记得要对这些变量作初始化
i = 0;
for (j = 0; j < 110; j++){
info[j].s.clear();
info[j].v.clear();
info[j].project.clear();
info[j].c = 0;
}
}
else if (str[0] >= 'A' && str[0] <= 'Z'){
i++;
info[i].project = str;
info[i].c = 0;
}
//用set就避免了名字的重复
else{
info[i].s.insert(str);
}
}
system("pause");
}
/*
UBQTS TXT
tthumb
LIVESPACE BLOGJAM
philton
tthumb
aeinstein
YOUBOOK
j97lee
philton
sswxyzy
j97lee
aeinstein
SKINUX
1
*/
poj 3297 Open Source
最新推荐文章于 2022-02-25 21:57:21 发布