这道题建议使用map来存储,使用set进行去重和排序,会大大减低代码书写难度。
这道题有几个需要注意的:
1,如果使用C++,读取一行必须使用getline(cin, str),因为名字中有空格。并且在读数据前使用getchar()吸收第一行数字和第二行数据之间的换行符
2,使用set插入数据:set.insert(),set迭代器:set<string>::iterator it,set迭代访问:it++。更加具体的set使用攻略,请点击:https://www.mmuaa.com/post/b9a637bded62f2a6.html
3,如果使用set进行排序去重,并使用printf输出C++STL的string类型变量,切记要使用c_str()函数将string转化成char*,否则输出乱码。
4,printf中输出%必须用转义符号:%%
啰嗦完毕,下面是代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <set>
using namespace std;
int main(){
map<string, int> mp;
set<string> st;
int n;
cin >> n;
getchar(); //吸收换行符
for(int i = 0; i < n; i++){
string str;
getline(cin, str); //读入一行
mp[str]++; //计数器累加
st.insert(str); //插入set,自动排序去重
}
for(set<string>::iterator it = st.begin(); it != st.end(); it++){
//迭代访问
printf("%s %.4f%%\n", (*it).c_str(), (double)mp[*it]/n*100);
}
return 0;
}