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;
}