姓名与ID(codevs 1027 未结题)

题目描述 Description

有N个人,各自有一个姓名和ID(别名)。每个人的姓名和ID都没有重复。这些人依次进入一间房间,然后可能会离开。过程中可以得到一些信息,告知在房间里的某个人的ID。你的任务是准确地确定每个人的ID。

输入描述 Input Description

第一行是整数N,表示N个人,N<=20。

接下来的一行是N个人的ID,用一个空格分隔。

接下来的若干行是过程的记录:一个字母和一个字符串。字母是E、L或M中的一个。E表示进入房间,后面跟的字符串表示进来的人的姓名;L表示离开房间,后面跟的字符串表示离开的人的姓名;M表示回答询问,后面跟的字符串表示:当前用这个ID人在房间里面。

最后一行Q表示结束。

所有的姓名和ID都由不超过20个的小写字母组成。所有姓名都会在记录中出现。

一开始时,房间时空的。

输出描述 Output Description

共N行,每行形如:“姓名:ID”,如果ID不能确定,输出???。

按照姓名的字典顺序输出。

样例输入 Sample Input

7

bigman mangler sinbad fatman bigcheese frenchie capodicapo

E mugsy

E knuckles

M bigman

M mangler

L mugsy

E clyde

E bonnie

M bigman

M fatman

M frenchie

L clyde

M fatman

E ugati

M sinbad

E moriarty

E booth

Q

样例输出 Sample Output

bonnie:fatman

booth:???

clyde:frenchie

knuckles:bigman

moriarty:???

mugsy:mangler

ugati:sinbad

/*
  匈牙利算法+map预处理,WA 80分,目前还没找出错误来
*/
#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
#define M 30
using namespace std;
map<string,int> id;
map<string,int> mz;
int in_mz[M],n,cnt;
int used[M],belong[M],a[M][M],be2[M];
string idd[M],mzz[M];
struct node
{
    int ID,MZ;
};node ans[M];
bool find(int i)
{
    for(int j=1;j<=n;j++)//循环姓名
      if(!used[j]&&a[i][j])
      {
          used[j]=1;
          if(!belong[j]||find(belong[j]))
          {
              belong[j]=i;
              return true;
          }
      }
    return false;
}
bool cmp(const node&x,const node&y)
{
    return mzz[x.MZ]<mzz[y.MZ];
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        a[i][j]=1;
    for(int i=1;i<=n;i++)
    {
        string s;cin>>s;
        id[s]=i;
        idd[i]=s;
    }
    while(1)
    {
        char c;cin>>c;
        if(c==‘Q‘)break;
        if(c==‘E‘)
        {
            string s;cin>>s;
            if(!mz[s])
            {
                mz[s]=++cnt;
                mzz[cnt]=s;
            }
            in_mz[mz[s]]=1;
        }
        if(c==‘L‘)
        {
            string s;cin>>s;
            in_mz[mz[s]]=0;
        }
        if(c==‘M‘)
        {
            string s;cin>>s;int num=id[s];
            for(int i=1;i<=n;i++)
              if(!in_mz[i])a[num][i]=0;
        }
    }
    for(int i=1;i<=n;i++)//循环ID
      if(find(i))
        memset(used,0,sizeof(used));
    for(int i=1;i<=n;i++)be2[belong[i]]=i;
    for(int i=1;i<=n;i++)//循环ID
    {
        memset(used,0,sizeof(used));
        a[i][be2[i]]=0;
        belong[be2[i]]=0;
        if(!find(i))
          ans[i].MZ=be2[i],ans[i].ID=i;
        else
          ans[i].MZ=be2[i],ans[i].ID=0;
        a[i][be2[i]]=1;
        belong[be2[i]]=i;
    }
    sort(ans+1,ans+n+1,cmp);
    idd[0]="???";
    for(int i=1;i<=n;i++)
      cout<<mzz[ans[i].MZ]<<":"<<idd[ans[i].ID]<<endl;
    return 0;
}

时间: 2024-11-14 12:25:18

姓名与ID(codevs 1027 未结题)的相关文章

电路的稳定性(codevs 2599 未结题)

题目描述 Description 有一个电路,上面有n个元件.已知i损坏而断开的概率是pi(i=1,2,3,…,n,0<=pi<=1).请你帮忙算出电路断路的概率. 元件的连接方式很简单,对电路的表示如下: 1.一个元件是最小的电路,用A表示元件1,B表示元件2,以此类推. 2.K个电路组成的串联电路表示为电路1,电路2……,电路k. 3.K个电路组成的并联电路表示为(电路1) (电路2) …… (电路k) 输入描述 Input Description 输入文件cir.in第1行是一个整数n(

《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方案及可行性分析 题目要求:ucOS-III的移植:设计三个小实验:单一任务.多任务.并发任务. 1.设计方案 首先运行老师给的范例代码熟悉开发软件和开发板的使用:收集资料简单了解UCOSIII的基本概念,然后进行UCOSIII移植(移植到STM32f407开发板):移植成功后开始进行UCOSIII实例编程(实

初步了解--状态压缩dp---poj1185炮兵布阵结题报告

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

[codevs1027]姓名与ID

试题描述 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人的ID.你的任务是准确地确定每个人的ID. 输入 第一行是整数N,表示N个人,N<=20. 接下来的一行是N个人的ID,用一个空格分隔. 接下来的若干行是过程的记录:一个字母和一个字符串.字母是E.L或M中的一个.E表示进入房间,后面跟的字符串表示进来的人的姓名:L表示离开房间,后面跟的字符串表示离开的人的姓名:M表示回答询问,后面跟

关于填报《国家自然科学基金资助项目结题报告》的补充说明

项目负责人在线提交<结题报告>后,只需打印系统生成的PDF版本,签字后交依托单位. 原<结题报告>撰写提纲与说明中第三项,要求随纸质结题报告提供的附件材料,在电子化后上传即可,无需再随结题报告报送纸质附件材料. <结题报告>中的摘要包括项目摘要和结题摘要两部分,其中项目摘要的内容从计划书中自动生成,结题摘要须以深入浅出的语言简明扼要地概括出项目的精华,如背景.方向.主要内容.重要结果.关键数据及其科学意义等.

poj1185炮兵布阵结题报告--初步了解--状态压缩dp

好吧,借助poj1185炮兵布阵这题,仔仔细细的了解了一下状态压缩动态规划 首先,借助题目,我们来看看状态压缩是个虾米东西..Ok follow me 一,所谓状态压缩 根据题意,我们得在长度为M 的地图上放置一些大炮(后面简称"放炮",应该不会被和谐吧),那么,首先不考虑山地,我们得把所有的放置方法都找出来,并且注意,这里只对于一行且长度为M(好吧,你可能要问考虑一行,左右互相隔2,互相不在攻击范围,那么上下呢?这里先不急,一步步来) 1,找出所有放炮的方法 假设长度为7,那么看下图

如何去寻找结题方案

如何去寻找结题方案 topcoder pyalg 声明 本文是 How to Find a Solution 的翻译转述篇.原文作者为Dumitru. 简介 topcoder的很多问题都可以通过读题直接解答.原因在于很多题目在某种程度上都具有相似的模式.熟练的coder多数都掌握了从题目中发现相应的模式.这种模式可以是某种算法数据结构,也可以是某种抽象建模. 本文的目的就是让大家都能具有这种观察出题目内在模式的能力. 各种解题方法 简单题目 多数的SRM 250points的题目都是属于此类型.

queryList界面,新收、旧存、已结、未结功能的错误与收获

1.关于日期的问题,在利用日期作为filter的条件时,稍不注意就会造成某一个天的缺失. 原因在于:对于日期要设定一个合理的分割规则,使得各个时间段的时间没有遗漏. 改进方法:由于存储的时间是yyyy-MM-dd格式,所以所有参数的时分秒都是0.因此,对一个时间段的end进行处理,在传参之后对这个时间的 天数+1,使用这个时间段时,使用<end时间作为统一标准,并且可以保证该时间段包前不包后的规则. 2.在对四种条件进行查询时,需要进行条件的过滤,除去普通的条件后还有特殊情况. 条件是同一个字段

20155211课程设计个人结题报告

20155211课程设计个人结题报告 个人贡献 参与课设题目讨论及完成全过程 辅助调试代码 资料收集 撰写小组结题报告 实践过程中的问题及解决: 编译之后出现如下错误:..\OBJ\HZ.axf: error: L6050U: The code size of this image (47788 bytes) exceeds the maximum allowed for this version of the linker. 出现错误的原因是:没有完全破解. 解决办法是:按照D:\实验箱资料2