poj 3297 Open Source

//这题由于用了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
*/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值