看到这个标题我想你一定会想为什么小编只发T3,T4的题解,原因有很多:1)小编也不怎么会讲;2)小编搜遍各大OJ,都没有找到可以提交的地方;3)虽然给了测试数据,小编懒得一个一个试。如果你找到了测评网址,欢迎留言。

先说T3,题目如下:

C、团伙 
【问题描述】
    TEIAI 集团共有 n 名员工,编号为 1~n。由于长期的权力斗争,他们形成了
复杂的势力网络。对于任意两名员工,他们可能是朋友,可能是敌人,也可能没
什么关系。并且这种关系满足:(1)朋友的朋友是我的朋友;(2)敌人的敌
人也是我的朋友。为了抱团取暖,党同伐异,员工们形成了若干团伙,每个团伙
均满足:团伙内的所有人互为朋友,团伙外的每个人都不是朋友。
 集团的高层认为,这种斗争关系可以加速优胜劣汰的过程,从而促进集团的
盈利。他们通过暗访得到了这样的 m 条信息:每条信息包含 3 个值 p,x,y,
p=F 表示员工 x 与 y 是朋友,p=E 表示员工 x 与 y 是敌人。请你根据这 m 条信
息,判断这些员工最多可能形成多少个团伙?
【输入格式】
  第 1 行为 n 和 m,1<n<1000,1<=m<=5000;
  以下 m 行,每行为 pxy。
【输出格式】
  一个整数,表示这 n 个人最多可能有几个团伙。
【输入样例】 
  64
  E14
  F35
  F46
  E12
【输出样例】 
3
【样例说明】{1},{2,4,6},{3,5}

  看起来这道题需要好好思索一番,此题一看就知道必须要用并查集(不会点这里)。首先,题目中出现了两种关系,分别是朋友关系和敌人关系,那么就要分类讨论了,先看朋友关系,这个好说,直接合并就可以了;那么敌人关系呢?根据敌人的敌人是朋友这个条件,只需要分别把敌人和另一个敌人的敌人合并即可。

代码如下:

  #include<iostream>
using namespace std;
int n,m,p,q,a[],ans=,num[];char c,ch;
int find(int x)//并查集
{
if(x==a[x]) return x;
else return a[x]=find(a[x]);
}
int main()
{
//freopen("group.in","r",stdin);
//freopen("group.out","w",stdout);
cin>>n>>m;
for(int i=;i<=n*;i++) a[i]=i;//为了后续操作更方便,将1~n存为每一个人的祖先,n+1~n+n为1~n每个人的敌人,例如1和1+n是敌人关系
for(int i=;i<=m;i++)
{
cin>>c;
cin>>p>>q;
if(c=='F') a[find(p)]=find(q);//朋友关系直接合并
else
{
a[find(p+n)]=find(q);//将敌人与敌人的敌人合并
a[find(q+n)]=find(p);//同上
}
}
for(int i=;i<=n;i++)
if(a[i]==i) ans++;//判断有多少个祖先即可知道有多少个团伙
cout<<ans;
return ;
}

T4,题目如下:

D、家谱 
【问题描述】 
给定一系列父子关系,求某些人的祖先。“祖先”指的是从该人开始,沿父
子关系向上追溯可以达到的辈分最大的人。
【输入格式】 
每行包含一个人名和一个标识符。标识符紧贴在名字的前面,不同标识符的
含义如下:(人名用 Name 指代)
#Name:从下一行开始,每一个以标识符+开头的人名都是 Name 的儿子,
直至遇到第一个不以+开头的人名;
+Name:上一个用#标识的人的儿子;
?Name:要求输出 Name 的祖先。
最后一行用一个字符$表示输入结束。
【输出格式】
按照输入文件的要求顺序,求出每一个用?标识的人的祖先,格式:本人的
名字+一个空格+祖先的名字+回车。
【输入样例】 
    #George
    +Rodney
    #Arthur
    +Gareth
    +Walter
    #Gareth
    +Edward
    ?Edward
    ?Walter
    ?Rodney
    ?Arthur
    $
【输出样例】 
    EdwardArthur
    WalterArthur
    RodneyGeorge
    ArthurArthur
【数据规模】 
 输入文件的总行数≤200,000。

  这道题与之前T3一样,需要用到并查集,但是合并是一件很麻烦的事情,如果装换成序号来做就太麻烦了,还会出现各种不必要的麻烦。那么就要请出传奇的map了。

  map是什么呢?用东西总得加头文件吧,要加上#include<map>才能用,map主要用来使两个元素发生联系,并且这两个元素可以是任意类型,这样数组下标就可以用string了。

代码如下:

 #include<iostream>
#include<cstring>
#include<map>
using namespace std;
map<string,string>a;//尖括号内的两种类型可以分别当成数组下标与数组值的类型
string c,s;char ch;
string find(string x)//字符串+并查集
{
if(a[x]==x) return x;
else return a[x]=find(a[x]);
}
int main()
{
for(;;)
{
cin>>ch;
cin>>c;
if(ch=='$') break;
else if(ch=='#')
{
s=c;
if(a[s]=="") a[s]=s;//如果s没有爹,那么就只能让s叫自己爹了
}
else if(ch=='+') a[c]=s;
else cout<<c<<" "<<find(c)<<endl;
}
return ;
}

【3.16高一(第二学期)模拟测试】 T3,T4题解的更多相关文章

  1. [CSP-S模拟测试50]反思+题解

    ??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...

  2. [NOIP模拟测试34]反思+题解

    不要陷入思维定势,如果长时间没有突破就要考虑更改大方向. 不要把简单问题复杂化. 做完的题就先放下,不管能拿多少分.不能过一段时间就回来调一下. $Solutions:$ A.次芝麻 因为$n+m$始 ...

  3. [CSP-S模拟测试48]反思+题解

    状态很垃圾的一场考试.感觉“这么多分就够了”的心态很是在给自己拖后腿. 打开题面,第一页赫然写着:$Claris' Contest$. 吓得我差点手一抖关掉.不过后来想想似乎强到变态的人出的题都不是很 ...

  4. [CSP-S模拟测试47]反思+题解

    打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...

  5. [NOIP模拟测试32]反思+题解

    又考挂了QAQ 总rank直接滑出前20 晚上考试脑子还算比较清醒,可惜都用来xjb乱想错误思路了. T1一眼推柿子,然而并没有头绪所以先码了个暴力.然后…… 一个垃圾暴力我调了1h,大概解决了两位数 ...

  6. csps模拟测试7576一句话题解

    题面:https://www.cnblogs.com/Juve/articles/11694454.html 75考了数学,化学和物理... T1: 假设有一个A和B,那么对于每一个j!=i,都有$\ ...

  7. [NOIP模拟测试37]反思+题解

    一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...

  8. [NOIP模拟测试7]visit 题解(组合数学+CRT+Lucas定理)

    Orz 因为有T的限制,所以不难搞出来一个$O(T^3)$的暴力dp 但我没试 据说有30分? 正解的话显然是组合数学啦 首先$n,m$可能为负,但这并没有影响, 我们可以都把它搞成正的 即都看作向右 ...

  9. [7.18NOIP模拟测试5]星际旅行 题解

    题面(加密) 考场上靠打表yy出的规律进而想到的正解233333 可以把一条双向边拆成两条单向边,这样的话每个点度数都为偶数,符合欧拉图的定义. 那么题目可以转化为:去掉两条边,使图中存在一条欧拉路. ...

  10. csps模拟测试707172部分题解myc

    题面:https://www.cnblogs.com/Juve/articles/11678524.html 骆驼:构造题,留坑 根据5×5的矩形构造成大矩形 毛一琛: mid in the midd ...

随机推荐

  1. 谷歌地图 API 开发之添加标记(解析以及补充)

    今天又看了下官网,发现官网上有地图标记的详细说明.当时居然眼瞎看不见,还琢磨了好久...#$%^&,一定是项目太急,没看到(^o^)/~地址:https://developers.google ...

  2. CF835 D DP

    所有所有阶回文串的个数.对于一个k阶回文串,定义为:它的左右两侧相同且是k-1阶回文串 显然高阶回文串由低阶构成,那么枚举长度,从左到右遍历,dp[l][r]代表从l到r串最大的阶数,cnt[i]记录 ...

  3. codeblocks快捷键(转)

    ==日常编辑== • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小.• 在编辑区按住右键可拖动代码,省去拉(尤其是横向)滚动条之麻烦:相关设置:Mouse Drag Scrolling.• Ctr ...

  4. Redis实战(六)管道

    https://www.cnblogs.com/huangxincheng/p/6212406.html

  5. C# 实现java中 wiat/notify机制

    最近在学习java,看到wiat/notify机制实现线程通信,由于平时工作用的C#,赶紧用C#方式实现一个demo. Java 代码: import java.util.ArrayList; imp ...

  6. Date、String、Calendar相互转化

    Date是在Jdk1.0出现的专门用来处理时间的类,但是由于Date在国际化方面存在限制,在Jdk1.1推出Calendar,现在Date的很多方法都已经过时,都迁移到Calendar上. 1.Dat ...

  7. rxjs自定义operator

    rxjs自定义operator

  8. 处理tomcat内存溢出问题

    TOMCAT起步内存溢出问题Exception in thread ""http-bio-8080"-exec-java.lang.OutOfMemoryError: P ...

  9. 【转载】python-协程

    转载自:廖雪峰的官方网站 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层 ...

  10. Python抓取微博评论

    本人是张杰的小迷妹,所以用杰哥的微博为例,之前一直看的是网页版,然后在知乎上看了一个抓取沈梦辰的微博评论的帖子,然后得到了这样的网址 然后就用m.weibo.cn进行网站的爬取,里面的微博和每一条微博 ...