数据结构第二次月考

7-1 文件传输

当两台计算机双向连通的时候,文件是可以在两台机器间传输的。给定一套计算机网络,请你判断任意两台指定的计算机之间能否传输文件?
输入格式:

首先在第一行给出网络中计算机的总数 N (2≤N≤104),于是我们假设这些计算机从 1 到 N 编号。随后每行输入按以下格式给出:

I c1 c2

其中I表示在计算机c1和c2之间加入连线,使它们连通;或者是

C c1 c2

其中C表示查询计算机c1和c2之间能否传输文件;又或者是

S

这里S表示输入终止。

输出格式:

对每个C开头的查询,如果c1和c2之间可以传输文件,就在一行中输出"yes",否则输出"no"。当读到终止符时,在一行中输出"The network is connected.“如果网络中所有计算机之间都能传输文件;或者输出"There are k components.”,其中k是网络中连通集的个数。

输入样例 1:

5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
S

输出样例 1:

no
no
yes
There are 2 components.

输入样例 2:

5
C 3 2
I 3 2
C 1 5
I 4 5
I 2 4
C 3 5
I 1 3
C 1 5
S

输出样例 2:

no
no
yes
yes
The network is connected.

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int cnt;
int p[N];
//并查集核心 
int find(int x){
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) p[i]=i;
    while(1){
        getchar();
        char op;
        int x,y;
        cin>>op>>x>>y;
        if(op=='S') break;
        if(op=='I') {
            int a=find(x),b=find(y);
            p[a]=b;//合并集合 
        }
        else if(op=='C'){
            if(find(x)==find(y)){puts("yes");}
            else puts("no");
        }
    }
    for(int i=1;i<=n;i++) {
        if(p[i]==i) cnt++;//统计连通集的个数 为 1 的话 1-N全部归于一个集合 
    }
    if(cnt==1) cout<<"The network is connected."<<endl;
    else printf("There are %d components.\n",cnt);
    return 0;
}

7-2 气球升起来

程序设计竞赛时,赛场升起各色气球多么激动人心呀!志愿者送气球忙得不亦乐乎,观战的某人想知道目前哪种颜色的气球送出最多。

输入格式:

测试数据有多组,处理到文件尾。每组数据先输入一个整数n(0<n≤5000)表示分发的气球总数。接下来输入n行,每行一个表示颜色的字符串(长度不超过20且仅由小写字母构成)。

输出格式:

对于每组测试,输出出现次数最多的颜色。若出现并列的情况,则只需输出ASCII码值最小的那种颜色。

输入样例:

3
pink
red
pink

输出样例:

pink

代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int main(){
    int n;
    map<string,int>mp;
    //根据题目要求输入多组数据 
    while(cin>>n){ 
        getchar();
        while(n--){
        string s;
        getline(cin,s);
        mp[s]++;//统计出现次数 
        }
    string a;
    int maxsum=0;
    map<string,int>::iterator it;
    for(it=mp.begin();it!=mp.end();it++){
        if(it->second>maxsum){maxsum=it->second;a=it->first;}
    }
    cout<<a<<endl;
    //由于多组数据,则需要把上一数据进行清零处理 
   for(it=mp.begin();it!=mp.end();it++){
       it->second=0;
    }
    }
    return 0;
}

7-3 题目统计

在ACM程序设计竞赛赛场,当某个队伍正确解答一道题目后就会在其前面升起1个彩色气球。而且每种颜色的气球只能用在一道题目上,所以不同颜色的气球不能相互替代。已知比赛过程中已送出的气球数量以及每个气球的颜色,请统计已成功解决的不同题目的总数。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(1≤n≤100),代表已经送出的气球总数,然后输入n个已送出气球的颜色(由长度不超过20且不包含空格的英文字母组成),数据之间间隔一个空格。注意,统计时,忽略气球颜色的大小写。

输出格式:

对于每组测试,在一行上输出一个整数,表示已成功解决的不同题目的总数。

输入样例:

1
5 RED Red Blue Green REd

输出样例:

3

代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
    map<string,int>mp;
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        getchar();
        string s;
        for(int i=0;i<n;i++){
            cin>>s;
            //由于题目要求不分大小写 则全部转换成大写或转换成小写进行统计 
            for(int j=0;j<s.length();j++){
                if(s[j]>='a'&&s[j]<='z'){
                    s[j]=s[j]-'a'+'A';
                }
            }
           mp[s]=1;
        }
        int sum=0;//统计题目的个数 
        map<string,int>::iterator it;
    for(it=mp.begin();it!=mp.end();it++){
        sum+=it->second;
    }
    cout<<sum<<endl;
    //同样进行清零 
   for(it=mp.begin();it!=mp.end();it++){
       it->second=0;
    }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值